我目前正在使用aligned_storage实现类似于boost :: optional的“Optional”类型。为了实现这一点,我有一个类成员如下:
typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type t_;
我使用放置new来创建对象,但我没有将返回的指针存储在任何地方。相反,在所有成员函数中,我像这样访问对象的基础类型(显然要通过一个布尔标志检查确保对象有效,该标志也存储在我的可选类型中):
T const* operator->() const {
return static_cast<T const*>(static_cast<void const*>(&t_));
}
我的问题是这样做是否安全。我理解使用放置new会改变对象的“动态类型”,只要我继续使用该类型访问内存,就不会有问题。但是我不清楚我是否必须持有从放置new返回的指针,还是只能在需要访问时将其强制转换为底层类型。我已经阅读了C++11标准的3.10节,但我不太熟悉标准术语,无法确定。
如果可能的话,如果您在答案中提供标准参考,我会感觉更好(它可以帮助我睡得更安稳:P)。
new
的结果来处理。显然,通过new[]
进行分配时,实现通常会在分配的前几个字节中存储有关销毁数组对象所需信息的数据。 - justinstd::optional
。 - Macmade