移动分配是通过destruct + move构造安全吗?

时间:2012-10-26 18:16:26

标签: c++ c++11 move-semantics placement-new move-assignment-operator

这是使用移动构造函数为大多数类定义移动分配的一种非常简单的方法:

class Foo {
public:
  Foo(Foo&& foo);                     // you still have to write this one
  Foo& operator=(Foo&& foo) {
    if (this != &foo) {               // avoid destructing the only copy
      this->~Foo();                   // call your own destructor
      new (this) Foo(std::move(foo)); // call move constructor via placement new
    }
    return *this;
  }
  // ...
};

这个调用你自己的析构函数的序列是否在标准C ++ 11中的this pointer safe上放置new?

2 个答案:

答案 0 :(得分:6)

只有你永远不会从这个类派生出一个类型。如果这样做,这将把对象变成怪物。遗憾的是,该标准以此作为解释对象生命周期的一个例子。在真实世界的代码中,这是一件非常糟糕的事情。

答案 1 :(得分:0)

从技术上讲,源代码在这个小例子中是安全的 。但实际情况是,如果你甚至看到Foo搞笑,你会调用UB。这是非常不安全的,完全不值得。只需像其他人一样使用交换 - 这是有原因的,因为这是正确的选择。此外,自我分配检查也很糟糕。