我偶然发现了基于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