【发布时间】:2012-06-09 23:29:07
【问题描述】:
以下类是否违反了严格的别名规则:
template<typename T>
class store {
char m_data[sizeof(T)];
bool m_init;
public:
store() : m_init(false) {}
store(const T &t) : init(true) {
new(m_data) T(t);
}
~store() {
if(m_init) {
get()->~T();
}
}
store &operator=(const store &s) {
if(m_init) {
get()->~T();
}
if(s.m_init) {
new(m_data) T(*s.get());
}
m_init = s.m_init;
}
T *get() {
if (m_init) {
return reinterpret_cast<T *>(m_data);
} else {
return NULL;
}
}
}
我对标准的解读是它不正确,但我不确定(我的用法是拥有一组对象T + 这些对象的一些元数据,但无需手动分配即可控制对象构造/解构memory) 作为分配的对象,在标准中用作放置 new 的示例。
【问题讨论】:
标签: c++ placement-new reinterpret-cast strict-aliasing explicit-destructor-call