9

c ++ 11標準によると、デフォルトの移動コンストラクターは次の場合にのみ生成されます。

  • Xには、ユーザーが宣言したコピーコンストラクターがなく、
  • Xには、ユーザーが宣言したコピー代入演算子がありません。
  • Xには、ユーザーが宣言したムーブ代入演算子がありません。
  • Xには、ユーザーが宣言したデストラクタがなく、
  • 移動コンストラクターは、削除済みとして暗黙的に定義されません。

それでも明示的にデフォルト設定できますか?clangで正しく動作するようです。たとえば、次のようになります。

class MyClass {
private:
  std::vector<int> ints;
public:
  MyClass(MyClass const& other) : ints(other.ints) {}
  MyClass(MyClass&& other) = default;
};
4

2 に答える 2

12

このルールの動機は、デフォルトのコピーコンストラクターがクラスで機能しない場合、デフォルトの移動コンストラクターも機能しない可能性があることです(ルール5、またはC ++ 11でのルール) 。そうです、プログラマーとしてのあなたの名誉で、それが機能することを明示的にデフォルトにすることができます。

サンプルコードでは、デフォルトと同じように機能するため、代わりにコピーコンストラクターを削除できます。

于 2012-06-12T19:21:50.050 に答える
4

はい。で自動的に生成できる関数のデフォルト生成をいつでも明示的に呼び出すことができます= default。それが構文の目的です。

于 2012-06-12T19:26:06.690 に答える