根据析构函数和移动构造函数实现移动赋值

HC4*_*ica 11 c++ move-constructor move-semantics c++11

假设我有一个管理内存的类,因此需要用户定义的特殊成员函数(想象vector或类似).

考虑move-assignment运算符的以下实现:

Class& operator=(Class&& rhs)
{
    this->~Class();                    // call destructor
    new (this) Class(std::move(rhs));  // call move constructor in-place
}
Run Code Online (Sandbox Code Playgroud)
  1. 以这种方式实现移动赋值运算符是否有效?也就是说,以这种方式调用析构函数和构造函数是否与语言中的任何对象生存规则相冲突?

  2. 以这种方式实现移动赋值运算符是一个好主意吗?如果没有,为什么不,并且有更好的规范方式?

Mar*_*k B 6

它无效:如果移动子对象的一部分调用此移动赋值怎么办?然后你销毁孩子(假设它有一个虚拟的析构函数)并在其位置重新创建一个父对象.

我会说,即使在非虚拟环境中,它仍然是一个坏主意,因为你不经常看到语法,它可能会使代码更难以为未来的维护者.

最好的方法是避免必须完全编写自己的移动构造函数(并使用默认值),让所有的类成员都自己动手.例如,依赖于unique_ptr等.如果失败的话,似乎在交换方面实现它(作为复制分配的复制和交换)将是一个容易理解的机制.