移动 - 需要被破坏的物体?

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()是无操作并且可以省略.

  • +1,我没有注意到无论如何都可能调用复制构造函数. (2认同)