【发布时间】:2018-12-16 07:46:09
【问题描述】:
我最近看到一个这样的类,它用于“按需”构造对象,而由于各种原因而不必使用动态内存分配。
#include <cassert>
template<typename T>
class StaticObject
{
public:
StaticObject() : constructed_(false)
{
}
~StaticObject()
{
if (constructed_)
((T*)object_)->~T();
}
void construct()
{
assert(!constructed_);
new ((T*)object_) T;
constructed_ = true;
}
T& operator*()
{
assert(constructed_);
return *((T*)object_);
}
const T& operator*() const
{
assert(constructed_);
return *((T*)object_);
}
private:
bool constructed_;
alignas(alignof(T)) char object_[sizeof(T)];
};
这段代码,即将正确对齐的字符数组转换为对象指针,是否被 C++14 标准视为未定义行为,还是完全没问题?
【问题讨论】:
-
认真做就好了。此外,C++17 中有
std::optional和boost::optional做类似的事情。但我会把它留给更了解这个具体案例的人。 -
使用新的展示位置。这将避免任何 UB。
-
@RichardCritten 不是
new ((T*)object_) T;完全是新的展示位置吗? -
旁注:不需要强制转换,因为放置 new 无论如何都接受 void 指针...
-
There's a standard class intended to be used this way... 没有直接回答 w.r.t
char的问题,但确实证明了该标准至少期望这些方面的某些东西是可能的。
标签: c++ pointers c++14 undefined-behavior