Oto bardzo prosty sposób zdefiniować zadanie ruch na niemal każdej klasy z konstruktora ruch:Czy przypisanie ruchu przez destruct + move konstrukcja jest bezpieczne?
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;
}
// ...
};
Czy ta sekwencja nazywając swoją destruktora a następnie umieszczenie nowego na ten wskaźnik bezpieczny w standardzie C++ 11 ?
Twój konstruktor ruchu powinien być "noexcept", inaczej spróbujesz zniszczyć już zniszczony obiekt, jeśli rzuci i odejdzie w UB-land. – ildjarn
Dobra sztuczka do przenoszenia/kopiowania jest po prostu [weź parametr według wartości] (http://stackoverflow.com/questions/9746748/does-it-make-sense-to-reuse-destructor-logic-by- using-stdswap-in-a-move-assign/9746772 # 9746772). Użytkownik albo przeniesie - skonstruuje parametr wartości, albo skopiuje - skonstruuje (lub wymusi na nim). Następnie możesz użyć 'std :: swap' do zamiany wartości na obiekt. –