1. ホーム
  2. c++

[解決済み] default/copy/move ctorとcopy/move assignment operatorの自動生成の条件?

2022-05-14 07:30:31

質問

コンパイラが通常デフォルトコンストラクタ、コピーコンストラクタ、および代入演算子を自動生成する条件について、記憶を呼び起こしたいと思います。

いくつかのルールがあったように記憶していますが、覚えていませんし、オンラインで信頼できるリソースを見つけることもできません。どなたか助けていただけないでしょうか。

どのように解決するのですか?

以下、"auto-generated"とは、"暗黙のうちにdefaultedとして宣言され、deletedとして定義されていない"を意味します。特殊なメンバ関数が宣言されているが、削除されたと定義されている状況があります。

  • デフォルトコンストラクタは、ユーザが宣言したコンストラクタがない場合、自動生成されます (§12.1/5) 。
  • コピー コンストラクタは、ユーザーが宣言した移動コンストラクタまたは移動代入演算子がない場合に自動生成されます(C++03 には移動コンストラクタまたは移動代入演算子がないため、C++03 では "always" と単純化されます) (§12.8/8).
  • コピー代入演算子は、ユーザーが宣言した移動コンストラクタまたは移動代入演算子がない場合、自動生成されます (§12.8/19).
  • デストラクタは、ユーザが宣言したデストラクタがない場合に自動生成されます (§12.4/4)。

C++11 以降のみ。

  • ユーザーが宣言したコピー コンストラクタ、コピー代入演算子、またはデストラクタがなく、生成された移動コンストラクタが有効である場合に自動生成されます (12.8/10 節)。
  • 移動代入演算子は、ユーザが宣言したコピーコンストラクタ、コピー代入演算子、デストラクタがなく、生成された移動代入演算子が有効であれば自動生成されます (例: 定数メンバの代入が必要ない場合) (§12.8/21).