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

Visual Studio でコンパイラ エラー C2280:「削除された関数を参照しようとしています」が表示されるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-27 10:31:03397ブラウズ

Why Am I Getting Compiler Error C2280:

コンパイラ エラー C2280: Visual Studio での「削除された関数を参照しようとしている」の解決

問題

Visual Studio 2013 は次のコード スニペットをコンパイルしますエラーなし:

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

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 &amp;)': attempting to reference a deleted function
1>  c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here

原因

C 11 では、クラス定義が明示的に宣言されていない場合コピー コンストラクターの場合、コンパイラーは暗黙的にコピー コンストラクターを生成します。ただし、クラスが明示的なコピー コンストラクターを提供せずに移動コンストラクターまたは移動代入演算子を定義する場合、暗黙的なコピー コンストラクターは =delete として定義されます。これは、異なる基本クラスと派生クラス間でオブジェクトをコピーするときに意図しないスライスを防ぐ 5 つのルールを強制するためです。

解決策

C2280 エラーを解決するには、次の場合にコピー コンストラクターを明示的に宣言する必要があります。クラスをコピー可能にしたいとします。ここには 2 つのオプションがあります:

  1. コピー コンストラクターを明示的に定義して削除します:

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = delete;
    };</code>
  2. 明示的にコピー コンストラクターを指定してデフォルトで指定します:

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = default;
       A&amp; operator=(const A&amp;) = default;
    };</code>

2 番目の方法では、移動代入演算子を明示的に指定し、ルールに従うデストラクターを宣言することも検討する必要があります。 5 つ中。

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

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