Ecco un modo molto semplice per definire l'assegnazione mossa per la maggior parte qualsiasi classe con un costruttore mossa:L'assegnazione del movimento tramite destruct + move construct è sicura?
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;
}
// ...
};
È questa sequenza di chiamare il proprio distruttore seguito da nuova collocazione sul questo puntatore di sicurezza nello standard C++ 11 ?
Il tuo costruttore di movimento è meglio che sia "noexcept", o tenterai di distruggere un oggetto già distrutto se getta e si allontana in terra UB. – ildjarn
Un buon trucco per spostare/copiare l'assegnazione è semplicemente [prendere il parametro per valore] (http://stackoverflow.com/questions/9746748/does-it-make-sense-to-reuse-destructor-logic-by- utilizzando-stdswap-in-a-move-assegnare/9746772 # 9746772). Un utente si sposterà-costruirà il parametro value o lo copierà (o lo eliderà). Puoi quindi usare 'std :: swap' per scambiare il valore nel tuo oggetto. –