此举是通过分配自毁+移动构建安全吗?(Is move assignment via destruct

2019-08-02 00:25发布

这里是一个非常简单的方法来定义一个转移构造几乎所有类移动分配:

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安全吗?

Answer 1:

只有当你永远不会得到从这个类的类型。 如果你这样做,这将会把对象变成一个怪物。 这是不幸的是,标准使用本作中解释对象生命周期的例子。 这是一个非常糟糕的事情在现实世界中的代码来完成。



Answer 2:

从技术上来说,源代码是在这个小小的例子安全。 但现实是,如果你连看富好笑,你将调用UB。 它是如此可怕的不安全,这是完全不值得。 只要使用交换像其他人else-有它的一个原因,它是因为这是正确的选择。 此外,自赋值检查是坏的。



文章来源: Is move assignment via destruct+move construct safe?