ホームページ  >  記事  >  バックエンド開発  >  Visual Studio 2013 で動作するコードをコンパイルすると、Visual Studio 2015 でエラー C2280 「削除された関数を参照しようとしています」がスローされるのはなぜですか?

Visual Studio 2013 で動作するコードをコンパイルすると、Visual Studio 2015 でエラー C2280 「削除された関数を参照しようとしています」がスローされるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-27 04:00:29793ブラウズ

Why Does Visual Studio 2015 Throw Error C2280

Visual Studio 2013 および 2015 の C コンパイラ エラー C2280 "削除された関数を参照しようとしています"

Microsoft Visual Studio 2013 の C コンパイラ

Visual Studio 2013

コピー コンストラクターまたは移動代入演算子がクラス定義で明示的に宣言されていない場合、コンパイラはコピー コンストラクターと移動代入演算子を異なる方法で処理します。

Visual Studio 2015

ただし、Visual Studio 2015 では、クラス定義に移動コンストラクターまたは移動代入演算子が含まれる場合、暗黙的に宣言されたコピーがコンストラクターは削除済みとして定義されています。

問題ステートメント

次のコードは Visual Studio 2013 では正常にコンパイルされますが、Visual Studio 2015 ではエラー C2280 が生成されます:

<code class="cpp">class A
{
public:
   A(){}
   A(A &&&) {}
};

int main(int, char*)
{
   A a;
   new A(a);
   return 0;
}</code>

C2280: 'A::A(const A &)' が削除された関数を参照しようとしています

解決策

これを修正するにはVisual Studio 2015 でエラーが発生した場合は、コピー コンストラクターと移動代入演算子を明示的に宣言するか、既定のコンストラクターを使用する必要があります:

オプション 1: コピー コンストラクターと移動代入演算子を明示的に宣言する

<code class="cpp">class A
{
public:
   A(){}
   A(A &&&) {}
   A(const A&) = default; // Default copy constructor
   A& operator=(const A&) = default; // Default move assignment operator
};</code>

オプション 2: クラスを削除済みまたは不完全として定義します

<code class="cpp">class A
{
public:
   A(){}
   A(A &&&) = delete; // Mark copy constructor as deleted

   A(const A&); // Incomplete constructor (cannot be instantiated)
   A& operator=(const A&); // Incomplete assignment operator (cannot be instantiated)
};</code>

以上がVisual Studio 2013 で動作するコードをコンパイルすると、Visual Studio 2015 でエラー C2280 「削除された関数を参照しようとしています」がスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。