Ich bin ein einfacher Programmierer. Die Variablen meiner Klassenmitglieder bestehen meistens aus POD-Typen und STL-Containern. Aus diesem Grund muss ich selten Zuweisungsoperatoren oder Kopierkonstruktoren schreiben, da diese standardmäßig implementiert sind.
Wenn ich std::move
Objekte verwende, die nicht beweglich sind, wird der Zuweisungsoperator verwendet, was bedeutet, dass dies std::move
absolut sicher ist.
Da ich ein einfacher Programmierer bin, möchte ich die Verschiebungsfunktionen nutzen, ohne jeder Klasse, die ich schreibe, einen Verschiebungskonstruktor / Zuweisungsoperator hinzuzufügen, da der Compiler sie einfach als " this->member1_ = std::move(other.member1_);...
" implementieren könnte.
Aber gibt es keinen besonderen Grund dafür (zumindest nicht in Visual 2010)?
Wichtiger; Gibt es eine Möglichkeit, dies zu umgehen?
Update: Wenn Sie sich die Antwort von GManNickG ansehen, bietet er ein großartiges Makro dafür. Und wenn Sie nicht wussten, dass Sie die Swap-Member-Funktion entfernen können, wenn Sie die Verschiebungssemantik implementieren.
quelle
MyClass::MyClass(Myclass &&) = default;
?Antworten:
Die implizite Generierung von Verschiebungskonstruktoren und Zuweisungsoperatoren war umstritten, und die jüngsten Entwürfe des C ++ - Standards wurden grundlegend überarbeitet, sodass sich derzeit verfügbare Compiler in Bezug auf die implizite Generierung wahrscheinlich anders verhalten.
Weitere Informationen zur Geschichte der Ausgabe finden Sie in der WG21-Papierliste 2010 und suchen Sie nach "mov".
In der aktuellen Spezifikation (N3225, ab November) heißt es (N3225 12.8 / 8):
In 12.8 / 22 gibt es eine ähnliche Sprache, die angibt, wann der Verschiebungszuweisungsoperator implizit als Standard deklariert wird. Die vollständige Liste der Änderungen, die zur Unterstützung der aktuellen Spezifikation der impliziten Bewegungsgenerierung in N3203 vorgenommen wurden, finden Sie in N3203: Verschärfung der Bedingungen für die Generierung impliziter Bewegungen , die weitgehend auf einer der in Bjarne Stroustrups Artikel N3201 vorgeschlagenen Schritte beruhten: Weitergehen .
quelle
cannot be defaulted *in the class body*
. Also habe ich den Destruktor draußen definiert und es hat funktioniert :). Ich finde es allerdings etwas seltsam. Hat jemand eine Erklärung? Compiler ist gcc 4.6.1virtual ~D() = default;
funktionieren und dennoch einen impliziten Verschiebungskonstruktor zulassen sollte.Implizit generierte Verschiebungskonstruktoren wurden für den Standard berücksichtigt, können jedoch gefährlich sein. Siehe Dave Abrahams Analyse .
Am Ende enthielt der Standard jedoch die implizite Generierung von Verschiebungskonstruktoren und Verschiebungszuweisungsoperatoren, allerdings mit einer ziemlich umfangreichen Liste von Einschränkungen:
Das ist aber noch nicht alles, was die Geschichte zu bieten hat. Ein ctor kann deklariert, aber dennoch als gelöscht definiert werden:
quelle
Tweak2
. Ich nehme an, es hat etwas damit zu tun, dass dasNumber
verschoben undvector
kopiert wird ... aber ich bin mir nicht sicher: / Ich verstehe, dass das Problem kaskadieren würdeTweak3
.Ja, ich bin auch diesen Weg gegangen. Hier ist dein Makro:
Wenn Sie
(Ich habe die echten Kommentare entfernt, die Länge und Dokumentation sind.)
Sie geben die Basen und / oder Mitglieder in Ihrer Klasse als Präprozessorliste an, zum Beispiel:
Und es kommt ein Verschiebungskonstruktor und ein Verschiebungszuweisungsoperator heraus.
(Abgesehen davon, wenn jemand weiß, wie ich die Details in einem Makro kombinieren könnte, wäre das sehr gut.)
quelle
VS2010 tut dies nicht, da sie zum Zeitpunkt der Implementierung nicht Standard waren.
quelle