「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Visual Studio 2015 が移動コンストラクター コードのコンパイル時にエラー C2280「削除されたコピー コンストラクター」を報告するのはなぜですか?

Visual Studio 2015 が移動コンストラクター コードのコンパイル時にエラー C2280「削除されたコピー コンストラクター」を報告するのはなぜですか?

2024 年 11 月 17 日に公開
ブラウズ:634

Why Does Visual Studio 2015 Report Error C2280 \

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