我偶然發現了基於LLVM的Optional.h類的Optional<T>
的實現,並且無法完全弄清楚它爲什麼按照它的方式實現。爲什麼LLVM的可選<T>以這種方式實現?
要儘量簡短,我只粘貼部分我不明白:
template <typename T>
class Optional
{
private:
inline void* getstg() const { return const_cast<void*>(reinterpret_cast<const void*>(&_stg)); }
typedef typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type storage_type;
storage_type _stg;
bool _hasValue;
public:
Optional(const T &y) : _hasValue(true)
{
new (getstg()) T(y);
}
T* Get() { return reinterpret_cast<T*>(getstg()); }
}
而且最幼稚的做法我能想到的:
template <typename T>
class NaiveOptional
{
private:
T* _value;
bool _hasValue;
public:
NaiveOptional(const T &y) : _hasValue(true), _value(new T(y))
{
}
T* Get() { return _value; }
}
問題:
- 如何解讀
storage_type
?作者的意圖是什麼? - 這條線的語義是什麼:
new (getstg()) T(y);
? - 爲什麼不天真的實施工作(或者,有什麼利弊做了
Optional<T>
類有超過NaiveOptional<T>
)?
1)T對齊的內存(見[doc](http://en.cppreference.com/w/cpp/types/aligned_storage)),2)放置新的,3)可選的優點:你保存一個動態分配。 – Borgleader
就#2而言:它被稱爲* placement new *,它基本上告訴'new'在先前分配的特定位置構造對象。 –
P.S:在你的天真實現中,布爾值是多餘的,你可以比較nullptr來知道你是否有值。 – Borgleader