C++ Compiler-Fehler C2280 "Versuch zum Verweis auf eine gelöschte Funktion" in Visual Studio 2013 und 2015
Diesem snippet kompiliert, ohne Fehler in Visual Studio 2013 (Version 12.0.31101.00 Update 4)
class A
{
public:
A(){}
A(A &&){}
};
int main(int, char*)
{
A a;
new A(a);
return 0;
}
während der Kompilierung mit dieser Fehlermeldung in Visual Studio 2015 RC (Version 14.0.22823.1 D14REL):
1>------ Build started: Project: foo, Configuration: Debug Win32 ------
1> foo.cpp
1>c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)': attempting to reference a deleted function
1> c:\dev\foo\foo.cpp(6): note: compiler has generated 'A::A' here
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Ich denke, dass der compiler die im Lieferumfang von Visual Studio 2015 erzeugt der Copy-Konstruktor und markiert Sie als =delete
und so bekomme ich die Fehlermeldung C2280 (die, übrigens, ich finde nicht dokumentiert msdn.microsoft.com).
Nun, sagen wir, ich habe eine Codebasis, die kompilierbare mit Visual Studio 2013 (und es funktioniert, weil es setzt auf die code automatisch generiert vom compiler) aber nicht kompilierbar mit Visual Studio 2015 aufgrund C2280, wie kann ich das problem beheben?
Dachte ich, zu erklären-Klasse A
auf diese Weise:
class A
{
public:
A(){}
A(A &&){}
A(const A&)=default;
};
bin ich etwas fehlt?
InformationsquelleAutor der Frage Alessandro Jacopson | 2015-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
[Klasse.Kopie]/7, Hervorhebung von mir:
Gibt es einen entsprechenden Abschnitt mit ähnlichem Wortlaut für die Kopie Zuordnung der in Absatz 18. Also, deine Klasse ist wirklich:
deswegen kann man nicht kopieren-es konstruieren. Wenn Sie einen move-Konstruktor/Zuordnung, und Sie wollen immer noch die Klasse kopierbar, müssen Sie explizit angeben, diese spezielle member-Funktionen:
Müssen Sie auch erklären, eine move-Zuweisungs-operator. Wenn Sie wirklich das Bedürfnis haben, für diese speziellen Funktionen, Sie werden auch wahrscheinlich benötigen, den Destruktor. Sehen Die Regel der Fünf.
InformationsquelleAutor der Antwort Barry
Ich hatte das gleiche problem und es wurde durch eine schlecht definierte member-variable:
Setzen diese in die Sache dem copy-Konstruktor gelöscht werden. Loswerden von "const" und ordnen Sie im Konstruktor.
InformationsquelleAutor der Antwort doby
Wenn Sie schreiben eine benutzerdefinierte move-Konstruktor für Ihre Klasse, die Kopier-Konstruktor gelöscht werden. Dies ist, weil, wenn eine Klasse benötigt ein spezielles Verhalten für seine move-Konstruktor, es muss wahrscheinlich einige ähnliche Verhalten in seiner Kopie-Konstruktor, so der copy Konstruktor gelöscht werden, um zu verhindern, dass Sie versehentlich über die default-Verhalten.
Wenn Sie wollen, definieren Sie Ihre eigenen move-Konstruktor und Verwendung der Standard-copy-Konstruktor, müssen Sie deklarieren es als
default
wie Sie vorgeschlagen, die in Ihrer Frage:Beachten Sie, dass wenn Sie ein benutzerdefiniertes move-Konstruktor, sollten Sie sich Gedanken über Ihre Zuweisungs-Operator und Destruktor als gut.
InformationsquelleAutor der Antwort TartanLlama