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

Susan Sarandon
リリース: 2024-10-27 20:01:02
オリジナル
340 人が閲覧しました

Why Does Visual Studio 2015 Report Error C2280

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート