Visual Studio 2015 レポート C2280: 「削除されたコピー コンストラクター」問題の調査
Visual Studio 2013 では、次のコードをコンパイルしてもエラーなしで実行されます。 :
<code class="cpp">class A { public: A(){} A(A &&{}){}; }; int main(int, char*) { A a; new A(a); return 0; }</code>
ただし、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 標準によれば、クラス定義で移動コンストラクターまたは移動代入演算子が宣言されている場合、コンパイラーはコピー コンストラクターとコピー代入演算子を削除済みとして暗黙的に生成します。これは、移動コンストラクターが存在する提供されたコード スニペットの場合です。
問題の解決
コンパイル エラーを解決するには、コピーの明示的な宣言が必要です。デフォルトのコンストラクターとコピー代入演算子が必要です:
<code class="cpp">class A { public: A(){} A(A &&{}){}; A(const A&{}) = default; };</code>
この変更により、コンパイラは、削除済みとしてマークせずに、必要なコピー コンストラクターとコピー代入演算子を生成します。
その他の考慮事項
クラスで移動セマンティクスが定義されている場合は、通常、移動代入演算子とデストラクターも定義することをお勧めします。 「5 つのルール」の原則に従うと、適切なリソース管理を確保できます。
以上がVisual Studio 2015 が移動コンストラクター コードのコンパイル時にエラー C2280「削除されたコピー コンストラクター」を報告するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。