Visual Studio 2015 レポート C2280:「削除されたコピー コンストラクター」問題の調査
Visual Studio 2013 では、次のコードをコンパイルしてもエラーなしで実行されます。 :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
ただし、Visual Studio 2015 RC でコンパイルすると、コンパイラによってエラー C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
エラーの理由
Visual Studio 2015 は、以前のものとは動作が異なります。 C 標準によれば、クラス定義で移動コンストラクターまたは移動代入演算子が宣言されている場合、コンパイラーはコピー コンストラクターとコピー代入演算子を削除済みとして暗黙的に生成します。これは、移動コンストラクターが存在する提供されたコード スニペットの場合です。
問題の解決
コンパイル エラーを解決するには、コピーの明示的な宣言が必要です。デフォルトとしてコンストラクターとコピー代入演算子が必要です:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
この変更により、コンパイラは必要なコピー コンストラクターとコピー代入演算子を削除済みとしてマークせずに生成します。
追加の考慮事項
クラスで移動セマンティクスが定義されている場合は、通常、移動代入演算子とデストラクターも定義することをお勧めします。 「5 つのルール」の原則に従うと、適切なリソース管理を確保できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3