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.
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
.
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.
Tags und Links c++ c++11 visual-studio-2012 visual-c++ move-semantics