Visual Studio 2013 kompiliert den folgenden Codeausschnitt ohne Fehler:
<code class="cpp">class A { public: A(){} A(A &&){} }; 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 &)': attempting to reference a deleted function 1> c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
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.
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:
Kopierkonstruktor explizit definieren und löschen:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = delete; };</code>
Explizit Stellen Sie den Kopierkonstruktor bereit und setzen Sie ihn standardmäßig vor:
<code class="cpp">class A { public: explicit A(){} A(A &&){} A(const A&) = default; A& operator=(const A&) = 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!