Hier ist eine sehr einfache Art und Weise bewegen Zuordnung für die meisten jede Klasse mit einem Umzug Konstruktor zu definieren:Ist Zugzuweisung über destruct + move construct safe?
class Foo {
public:
Foo(Foo&& foo); // you still have to write this one
Foo& operator=(Foo&& foo) {
if (this != &foo) { // avoid destructing the only copy
this->~Foo(); // call your own destructor
new (this) Foo(std::move(foo)); // call move constructor via placement new
}
return *this;
}
// ...
};
Ist diese Folge von Aufrufen Ihrer eigenen destructor durch Platzierung neu auf dem dieser Zeiger sicher in Standard C++ 11 gefolgt ?
Ihr Move-Konstruktor sollte besser 'noexcept' sein, oder Sie werden versuchen, ein bereits zerstörtes Objekt zu zerstören, wenn es in UB-Land wirft und davonwandert. – ildjarn
Ein guter Trick für verschieben/kopieren Zuordnung ist einfach zu [den Parameter nach Wert annehmen] (http://stackoverflow.com/questions/9746748/does-it-make-sense-to-reuse-destructor-logic-by- using-stdswap-in-a-move-assign/9746772 # 9746772). Ein Benutzer wird entweder den Werteparameter verschieben oder ihn konstruieren (oder in ihn hineinbauen). Sie können dann 'std :: swap' verwenden, um den Wert in Ihr Objekt zu tauschen. –