Warum bewegt sich der Konstruktor / Zuweisungsoperator von C ++ 11 nicht wie erwartet?

8
%Vor%

Meine erwartete Ausgabe sollte lauten:

%Vor%

Die tatsächliche Ausgabe ist jedoch: (Der C ++ - Compiler lautet: Visual Studio 2012)

%Vor%

Ist das ein Fehler von VC ++? oder nur mein Missverständnis?

    
xmllmx 28.09.2012, 21:11
quelle

3 Antworten

14

Laut diesem Blogpost implementiert VC ++ 2012 derzeit < a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2844.html"> N2844 + DR1138 , aber nicht N3053 . Daher generiert der Compiler nicht implizit Move-Konstruktoren oder Zuweisungsoperatoren für Sie. Wenn Sie explizite Standard- und Verschiebungskonstruktoren zu B hinzufügen, erhalten Sie die erwartete Ausgabe.

    
ildjarn 28.09.2012, 21:30
quelle
7

Visual C ++ 2012 implementiert die endgültige C ++ 11-Spezifikation für rvalue-Referenzen und Verschiebeoperationen nicht (die Spezifikation wurde während des Standardisierungsprozesses mehrmals geändert). Weitere Informationen finden Sie im Visual C ++ Team Blog-Beitrag "C ++ 11 Funktionen in Visual C ++ 11 ", unter rvalue references .

Dies zeigt sich in Ihrem Beispiel speziell auf zwei Arten:

  • Die Definition der benutzerdefinierten Verschiebeoperationen in A unterdrückt die implizit deklarierten Kopieroperationen nicht.

  • Es gibt keine implizit definierten Verschiebeoperationen für B .

James McNellis 28.09.2012 21:33
quelle
1

Ich glaube nicht, dass die Generierung des copy ctor durch die Deklaration des move-Konstruktors verhindert wird. ... und es scheint, dass der Compiler den Kopierkonstruktor dem Move-Konstruktor vorzieht.

Nach 12.8 [class.copy] Absatz 7 sollte das Vorhandensein eines Move-Konstruktors den Kopierkonstruktor tatsächlich verhindern:

  

Wenn die Klassendefinition einen Kopierkonstruktor nicht explizit deklariert, wird einer implizit deklariert. Wenn die Klassendefinition einen Verschiebungskonstruktor oder einen Verschiebungszuweisungsoperator deklariert, wird der implizit deklarierte Kopierkonstruktor als gelöscht definiert. Ansonsten ist es als Standard definiert (8.4).

Allerdings wurden die Details der Konstruktion der Bewegung bis spät in den Prozess geändert und es scheint, dass VC ++ den eigentlichen Standard nicht implementiert, sondern eine frühere Revision.

    
Dietmar Kühl 28.09.2012 21:23
quelle