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?
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:
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.)
Tags und Links c++ visual-studio c++11 visual-studio-2013