Ich schätze die C++ 11-Standard schreibt vor:Visual Studio 2013 nicht den Kopierkonstruktor löschen, wenn eine benutzerdefinierte Bewegung Konstruktor
Wenn die Klassendefinition explizit keine Kopie Konstruktor deklarieren, Eins wird implizit erklärt. Wenn die Klassendefinition einen Move-Konstruktor oder Move-Zuweisungsoperator deklariert, wird der implizit deklarierte Copy-Konstruktor als gelöscht definiert; Andernfalls wird als Standard definiert.
(tatsächlich kopiert von here)
Der folgende Code:
#include <iostream>
struct C
{
int x = 1;
C()
{
}
C(C&&)
{
}
};
int main()
{
const C c;
C c2(c);
std::cout << c.x << " " << c2.x << std::endl;
return 0;
}
nicht kompiliert auf gcc 4.9.0
, sondern kompiliert nur gut auf 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?
Can Sie senden die Kompilierungsfehlermeldung (en)? Wäre nützlich ... – floppy12
@ floppy12: http://ideone.com/yhqPBb Das ist gcc 4.9.2 in C++ 14-Modus. Ihr gcc wird wahrscheinlich das gleiche tun. Jedenfalls ist es nicht das Vorhandensein eines Fehlers mit gcc das Problem, aber seine Abwesenheit mit VS. – gd1