fre*_*low 10 c++ destructor rvalue-reference move-semantics c++11
如果我a从中移动构造b,是否仍然需要破坏b,或者我可以在不这样做的情况下逃脱?
在实施optional<T>模板期间,这个问题在我脑海中浮现.摘抄:
~optional()
{
if (initialized)
{
reinterpret_cast<T*>(data)->~T();
}
}
optional(optional&& o) : initialized(o.initialized)
{
if (initialized)
{
new(data) T(std::move(*o)); // move from o.data
o.initialized = false; // o.data won't be destructed anymore!
}
}
Run Code Online (Sandbox Code Playgroud)
当然,我可以initialized用三值枚举替换bool ,区分初始化,非初始化和移动.我只是想知道这是否是绝对必要的.
How*_*ant 14
是的,它仍然需要破坏b.从对象移动是一个有效的构造对象.在某些情况下,它甚至可能拥有仍需要处理的资源.在您展示的通用代码中,T甚至可能没有移动构造函数.在这种情况下,您可以调用复制构造函数.所以你绝对不能假设~T()是无操作并且可以省略.