web-dev-qa-db-ja.com

移動コンストラクターは自動的に生成されますか?

私はたくさんのSTLコンテナを持っている大きなクラスを持っています。
コンパイラーは、それらのコンテナーをターゲットに移動する移動コンストラクターを自動的に作成しますか、それとも自分で作成する必要がありますか?

34
Dani

クラスXの移動コンストラクターは、次の場合にデフォルトとして暗黙的に宣言されます。

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

したがって、たとえば、クラスに移動コンストラクターを持たないクラスタイプのデータメンバーがある場合、暗黙的に宣言された移動コンストラクターが宣言されているため、コピー/移動コンストラクターが宣言されていなくても、クラスは移動コンストラクターを取得しません。削除済みとして定義されます(そのデータメンバーのため)。

デフォルトの移動コンストラクターは、通常、デフォルトのコピーコンストラクターに関連付けられています。あなたが他を得るときあなたは1つを得る。ただし、コピーコンストラクター/代入演算子を作成する場合、デフォルトのコピーは作成されませんおよび移動コンストラクター/代入演算子は作成されません。いずれかのセットのいずれかを作成する場合は、それらすべてを作成する必要があります。

3
Nicol Bolas