9

ムーブコンストラクタを使用して、ほとんどすべてのクラスのムーブ代入を定義する非常に簡単な方法は次のとおりです。

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で安全ですか?

4

2 に答える 2

6

このクラスから型を派生させない場合にのみ使用してください。そうした場合、これはオブジェクトを怪物に変えます。標準がこれをオブジェクトの寿命を説明する例として使用しているのは残念です。実際のコードで行うのは本当に悪いことです。

于 2012-10-26T18:21:01.930 に答える
0

技術的には、この小さな例ではソース コードは安全です。しかし、現実には、Foo を面白く見ただけでも、UB を呼び出すことになります。それは非常に恐ろしいほど安全ではないので、それだけの価値はありません。他のみんなと同じようにスワップを使用してください。それには理由があり、それが正しい選択だからです。また、自己割り当てチェックも良くありません。

于 2012-10-26T18:29:23.693 に答える