Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erhalte ich in Visual Studio den Compiler-Fehler C2280: „Versuch, auf eine gelöschte Funktion zu verweisen“?

Warum erhalte ich in Visual Studio den Compiler-Fehler C2280: „Versuch, auf eine gelöschte Funktion zu verweisen“?

Linda Hamilton
Linda HamiltonOriginal
2024-10-27 10:31:03397Durchsuche

Why Am I Getting Compiler Error C2280:

Compilerfehler C2280: Beheben von „Versuch, auf eine gelöschte Funktion zu verweisen“ in Visual Studio

Das Problem

Visual Studio 2013 kompiliert den folgenden Codeausschnitt ohne Fehler:

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

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

Allerdings tritt in Visual Studio 2015 RC der Fehler C2280 auf:

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

Ursache

In C 11, wenn eine Klassendefinition nicht explizit deklariert wird Wenn es sich um einen Kopierkonstruktor handelt, generiert der Compiler implizit einen solchen. Wenn die Klasse jedoch einen Verschiebungskonstruktor oder Verschiebungszuweisungsoperator definiert, ohne auch einen expliziten Kopierkonstruktor bereitzustellen, wird der implizite Kopierkonstruktor als =delete definiert. Damit soll die Fünferregel durchgesetzt werden, die ein unbeabsichtigtes Slicing beim Kopieren von Objekten zwischen verschiedenen Basis- und abgeleiteten Klassen verhindert.

Lösung

Um den C2280-Fehler zu beheben, müssen Sie den Kopierkonstruktor explizit deklarieren, wenn Sie möchten, dass die Klasse kopierbar ist. Hier sind zwei Optionen:

  1. Kopierkonstruktor explizit definieren und löschen:

    <code class="cpp">class A {
    public:
       explicit A(){}
       A(A &amp;&amp;){}
       A(const A&amp;) = delete;
    };</code>
  2. Explizit Stellen Sie den Kopierkonstruktor bereit und setzen Sie ihn standardmäßig vor:

    <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>

Beim zweiten Ansatz müssen Sie auch explizit einen Verschiebungszuweisungsoperator angeben und erwägen, einen Destruktor zu deklarieren, um der Regel zu folgen von Fünf.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich in Visual Studio den Compiler-Fehler C2280: „Versuch, auf eine gelöschte Funktion zu verweisen“?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn