29

これは些細な質問になるはずですが、stackoverflowで明示的に見つけることができませんでした。

以下は、ユーザーから提供されない場合、暗黙的に定義されます。

  1. デフォルト(パラメーターなし)コンストラクター
  2. コピーコンストラクタ
  3. コピー代入演算子
  4. デストラクタ

しかし、私はどこかで(今は見つけられないようですが)、コンパイラーが暗黙的にそれらを実装しないいくつかの条件があることを読みました。

これらの条件は何ですか?

4

1 に答える 1

53

次の場合、デフォルトのコンストラクター(たとえばX())は暗黙的に生成されません。

  • コンストラクターを明示的に宣言しました
  • デフォルトで構成できないデータメンバーがあります(参照、constオブジェクト、またはデフォルトのコンストラクターがないかアクセスできないクラスなど)。
  • (C ++ 11)コンパイラに、を使用して生成しないように明示的に指示しましたX() = delete;

次の場合、コピーコンストラクタ(たとえばX(const X&))は暗黙的に生成されません。

  • コピーコンストラクターを明示的に宣言しました(クラスの場合、コンストラクターは、またはXを取ります)XX&const X&
  • コピー構築可能ではないデータメンバーがあります(コピーコンストラクターがない、またはアクセスできないクラスなど)
  • 基本クラスはコピー構築可能ではありません
  • (C ++ 11)ムーブコンストラクターまたはムーブ代入演算子を宣言しました
  • (C ++ 11)コンパイラに、を使用して生成しないように明示的に指示しましたX(const X&) = delete;

次の場合、コピー代入演算子(たとえば、X& operator=(const X&))は暗黙的に生成されません。

  • コピー代入演算子を明示的に宣言しました(クラスXの場合は、または)operator=XX&const X&
  • クラスにコピー代入できないデータメンバーがあります(参照、constオブジェクト、または代入演算子がないかアクセスできないクラスなど)
  • 基本クラスはコピー割り当て可能ではありません
  • (C ++ 11)ムーブコンストラクターまたはムーブ代入演算子を宣言しました
  • (C ++ 11)コンパイラに、を使用して生成しないように明示的に指示しましたX& operator=(const X&) = delete;

次の場合、デストラクタ(たとえば~X())は暗黙的に生成されません。

  • デストラクタを明示的に宣言しました
  • (C ++ 11)コンパイラに、を使用して生成しないように明示的に指示しました~X() = delete;

移動コンストラクター(C ++ 11)(たとえば、X(X&&))は、次の場合に暗黙的に生成されません。

  • 移動コンストラクターを明示的に宣言しました(クラスXの場合、コンストラクターを取るX&&
  • コピー代入演算子、コピーコンストラクタ、デストラクタ、またはムーブ代入演算子を宣言しました
  • クラスに移動構築できないデータメンバーがあります(constつまり、参照であるか、削除された、アクセスできない、またはあいまいな移動コンストラクターがあります)
  • 基本クラスは移動構築できません
  • を使用して生成しないようにコンパイラに明示的に指示しましたX(X&&) = delete;

ムーブ代入演算子(C ++ 11)(たとえば、X& operator=(X&&))は、次の場合に暗黙的に生成されません。

  • ムーブ代入演算子を明示的に宣言しXました(クラスの場合、operator=テイクX&&
  • コピー代入演算子、コピーコンストラクタ、デストラクタ、または移動コンストラクタを宣言しました
  • クラスにムーブ代入できないデータメンバーがあります(constつまり、参照であるか、削除された、アクセスできない、またはあいまいなムーブ代入演算子があります)
  • 基本クラスを移動割り当てすることはできません
  • を使用して生成しないようにコンパイラに明示的に指示しましたX& operator=(X&&) = delete;
于 2013-03-23T19:04:27.630 に答える