Heim  >  Artikel  >  Backend-Entwicklung  >  Warum meldet Visual Studio 2015 beim Kompilieren des Move-Konstruktorcodes den Fehler C2280 „Deleted Copy Constructor'?

Warum meldet Visual Studio 2015 beim Kompilieren des Move-Konstruktorcodes den Fehler C2280 „Deleted Copy Constructor'?

Susan Sarandon
Susan SarandonOriginal
2024-10-27 20:01:02348Durchsuche

Why Does Visual Studio 2015 Report Error C2280

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!

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