「C++ オブジェクト モデルの内部」に従って、次の 4 つの条件の少なくとも 1 つが true の場合にのみ、コピー コンストラクターがコンパイラーによって生成されます (プログラマーによって宣言されていない場合)。
コピー コンストラクターが存在するクラスのメンバー オブジェクトがクラスに含まれている場合 (前の String クラスの場合のようにクラス デザイナーによって明示的に宣言されるか、クラス Word の場合のようにコンパイラーによって合成されます)。
クラスが、コピー コンストラクターが存在する基底クラスから派生した場合 (ここでも、明示的に宣言または合成されます)
クラスが 1 つ以上の仮想関数を宣言するとき
クラスが、1 つ以上の基本クラスが仮想である継承チェーンから派生した場合
つまり、コンストラクターだけを持つクラスがある場合、コピーコンストラクターはコンパイラーによって提供されません。
例を見てみましょう:
class test
{
test(){}
};
int main()
{
test obj1; //statement 1
test obj2(obj1); //statement 2
}
上記のコードは正常に動作します。クラステストに次の行を追加すると、問題が発生します。
test(const test& rhs) = delete;
「= delete」は、コピー コンストラクターが自動的に提供されないようにします。上記の行を追加した後、ステートメント 2 のエラーが表示されますUse of deleted function test::test(const test&)
。
私の質問は次のとおりです。「Inside C++ Object Model」に従って、上記のクラスのコピー コンストラクターは必要ありません。そのため、(削除を使用して) コピー コンストラクターを生成しないように明示的に言っている場合、エラーが発生するのはなぜですか? コンパイラーが上記のクラスのコピーコンストラクターを必要としないと予想していたので。
gcc バージョン 4.6.3 を使用しています。