9

Here's a very easy way to define move assignment for most any class with a move constructor:

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;
  }
  // ...
};

Is this sequence of calling your own destructor followed by placement new on the this pointer safe in standard C++11?

4

2 回答 2

6

仅当您永远不会从此类派生类型时。如果这样做,这会将对象变成怪物。不幸的是,该标准将此作为解释对象生命周期的示例。在现实世界的代码中这样做是一件非常糟糕的事情。

于 2012-10-26T18:21:01.930 回答
0

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

于 2012-10-26T18:29:23.693 回答