Visual Studio 2013 löscht den Kopierkonstruktor nicht, wenn ein benutzerdefinierter Verschiebungskonstruktor bereitgestellt wird

8

Ich schätze den C ++ 11-Standard:

  

Wenn die Klassendefinition keine Kopie explizit deklariert   Konstruktor, einer wird implizit deklariert. Wenn die Klassendefinition   deklariert einen Move - Konstruktor oder einen Zuweisungsoperator, der   implizit deklarierter Kopierkonstruktor wird als gelöscht definiert ; Andernfalls,   Es ist als Standard definiert.

(tatsächlich kopiert von hier )

Der folgende Code:

%Vor%

kompiliert nicht auf gcc 4.9.0 , kompiliert aber nur gut in Visual Studio 2013 ( Compiler Version 18.00.21005.1 for x86 ). Ist das eine weitere Visual Studio Verletzung des Standards, oder mache ich diesmal etwas falsch? Wenn dies eine Verletzung des Standards ist, gibt es einen Tracking-Fehler oder eine Quelle, in der dieses Verhalten dokumentiert ist?

    
gd1 08.05.2015, 09:38
quelle

1 Antwort

5

Sie machen nichts falsch, und Ihre Interpretation des Standards ist korrekt. Visual C ++ 2013 implementiert diese Regeln tatsächlich nicht ordnungsgemäß.

Ein relevanter Fehlerbericht ist hier:

Der Standard-Kopierkonstruktor wird auch dann generiert, wenn ein benutzerdefinierter Move-Konstruktor definiert ist [c ++ 11]

Es ist als Won't Fix markiert und der Kommentar vom Entwicklungsteam lautet:

  

Visual Studio 2013 implementiert die C ++ 11-Regeln tatsächlich nicht vollständig   Steuerung spezieller Mitgliederfunktionen und Verschieben von Operationen. Wir werden   Fügen Sie in der nächsten Hauptversion von Visual Studio eine Fehlerbehebung für diesen Fehler hinzu.

Die gute Nachricht ist, dass die Dinge in Visual C ++ 2015 RC anscheinend richtig funktionieren. Ich habe gerade überprüft, dass Ihr Code sowohl Compiler- als auch IntelliSense-Fehler auslöst. Die Compiler-Diagnose lautet:

%Vor%

(Nach dem, was ich in den letzten Monaten getestet habe, entwickelt sich MSVC14 zu einem ziemlich guten C ++ - Compiler - viele Standard-Compliance-Probleme wurden behoben.)

    
bogdan 08.05.2015, 11:25
quelle