Warum kein Standard-move-assignment / move-constructor?
Ich bin ein einfacher Programmierer. Meine Klasse member-Variablen am häufigsten besteht der POD-Typen und STL-Containern. Da ich nur selten schreiben Zuweisungsoperatoren oder copy-Konstruktoren, da diese standardmäßig implementiert.
Hinzu, wenn ich std::move
auf Objekte, nicht beweglich, es verwendet den Zuweisungsoperator, d.h. std::move
ist absolut sicher.
So, ich bin ein einfacher Programmierer, würde ich mag, um die Vorteile der move-Funktionen, ohne einen move-Konstruktor/Zuweisungsoperator für jede Klasse I schreiben, da der compiler könnte einfach umsetzen Sie als "this->member1_ = std::move(other.member1_);...
"
Aber nicht (zumindest nicht in Visual 2010), gibt es einen bestimmten Grund dafür?
Wichtiger; gibt es eine Möglichkeit dies zu umgehen?
Update:
Wenn Sie schauen nach GManNickG Antwort, er bietet ein tolles makro. Und wenn Sie nicht wissen, wenn Sie implementieren move-Semantik können Sie entfernen Sie die swap Memberfunktion.
InformationsquelleAutor der Frage Viktor Sehr | 2011-01-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die implizite Generierung von move-Konstruktoren und Zuweisungsoperatoren wurde strittig, und es wurden wichtige änderungen in den letzten Entwürfe der C++ - Standard, so dass aktuell verfügbare Compiler wird wahrscheinlich anders Verhalten mit Bezug auf implizite generation.
Mehr über die Geschichte des Problems finden 2010 WG21 Papiere Liste und die Suche nach "mov"
Der aktuellen Spezifikation (N3225, ab November) Staaten (N3225 12.8/8):
Gibt es ähnliche Sprache, in 12,8/22, der angibt, Wann der move-Zuweisungs-operator implizit deklariert als ausgefallen. Finden Sie die vollständige Liste von änderungen zu unterstützen, die aktuelle Spezifikation der impliziten move-generation in N3203: Verschärfung der Bedingungen für die Generierung impliziten bewegt
die sich weitgehend auf eine von der beschlussvorschläge von Bjarne Stroustrup ' s Papier N3201: Moving rechts entlang.
InformationsquelleAutor der Antwort James McNellis
Implizit generiert move-Konstruktoren wurden als für den standard, kann aber gefährlich sein. Siehe Dave Abrahams ist Analyse.
In das Ende, jedoch der standard Tat auch implizite Generierung von move-Konstruktoren und move-Zuweisungsoperatoren, allerdings mit einer ziemlich umfangreiche Liste von Einschränkungen:
Dass nicht ganz alle, es ist die Geschichte aber. Ein ctor, erklärt werden kann, aber immer noch definiert als gelöscht:
InformationsquelleAutor der Antwort Jerry Coffin
Yeah, ich ging diesen Weg auch. Hier ist das makro:
(Ich habe entfernt die wirkliche Kommentare, die Länge und Dokumentarfilm.)
Geben Sie die Basen und/oder Mitglieder in Ihrer Klasse als ein Präprozessor-Liste, zum Beispiel:
Und heraus kommt ein move-Konstruktor und move-Zuweisungs-operator.
(Nebenbei, wenn jemand weiß wie ich die kombinieren könnte, die details in einem makro, das wäre Dünung.)
InformationsquelleAutor der Antwort
VS2010 nicht tun es, weil Sie nicht Standard bei der Umsetzung.
InformationsquelleAutor der Antwort Puppy