Visual Studio 2015-Berichte C2280: Untersuchung des Problems „Deleted Copy Constructor“
In Visual Studio 2013 wird das Kompilieren des folgenden Codes ohne Fehler ausgeführt :
<code class="cpp">class A { public: A(){} A(A &&{}){}; }; int main(int, char*) { A a; new A(a); return 0; }</code>
Bei der Kompilierung in Visual Studio 2015 RC löst der Compiler jedoch den Fehler C2280 aus:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
Der Grund für den Fehler
Visual Studio 2015 verhält sich anders als sein Vorgänger. Wenn eine Klassendefinition gemäß dem C-Standard einen Verschiebungskonstruktor oder einen Verschiebungszuweisungsoperator deklariert, generiert der Compiler implizit einen Kopierkonstruktor und einen Kopierzuweisungsoperator als gelöscht. Dies ist im bereitgestellten Codeausschnitt der Fall, in dem der Verschiebungskonstruktor vorhanden ist.
Behebung des Problems
Um den Kompilierungsfehler zu beheben, ist die explizite Deklaration der Kopie erforderlich Konstruktor und Kopierzuweisungsoperator als Standard sind erforderlich:
<code class="cpp">class A { public: A(){} A(A &&{}){}; A(const A&{}) = default; };</code>
Mit dieser Änderung generiert der Compiler den erforderlichen Kopierkonstruktor und Kopierzuweisungsoperator, ohne sie als gelöscht zu markieren.
Zusätzliche Überlegungen
Wenn die Klasse Bewegungssemantik definiert, wird im Allgemeinen empfohlen, auch einen Verschiebungszuweisungsoperator und einen Destruktor zu definieren. Das Befolgen des „Fünfregelprinzips“ kann dazu beitragen, ein ordnungsgemäßes Ressourcenmanagement sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum meldet Visual Studio 2015 beim Kompilieren des Move-Konstruktorcodes den Fehler C2280 „Deleted Copy Constructor'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!