Вот очень простой способ определить назначение перемещения для большинства классов с помощью конструктора перемещения:
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;
}
// ...
};
Безопасна ли эта последовательность вызова вашего собственного деструктора с последующим размещением нового в указателе this в стандарте C ++ 11?
Только если вы никогда не извлекаете тип из этого класса. Если вы это сделаете, это превратит объект в чудовище. К сожалению, стандарт использует это в качестве примера при объяснении времени жизни объекта. Это действительно плохая вещь в реальном коде.
Технически исходный код безопасен в этом крошечном примере. Но реальность такова, что если вы когда-нибудь даже смешно посмотрите на Фу, вы будете вызывать UB. Это настолько ужасно небезопасно, что оно того не стоит. Просто используйте своп, как и все остальные — для этого есть причина, и это потому, что это правильный выбор. Кроме того, самопроверка — это плохо.