Heim > Backend-Entwicklung > C++ > 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
Freigeben: 2024-10-27 10:31:03
Original
492 Leute haben es durchsucht

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
    Nach dem Login kopieren
  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>
    Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage