Безопасно ли назначение перемещения с помощью destruct + move construct?

Вот очень простой способ определить назначение перемещения для большинства классов с помощью конструктора перемещения:

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?

8

Решение

Только если вы никогда не извлекаете тип из этого класса. Если вы это сделаете, это превратит объект в чудовище. К сожалению, стандарт использует это в качестве примера при объяснении времени жизни объекта. Это действительно плохая вещь в реальном коде.

6

Другие решения

Технически исходный код безопасен в этом крошечном примере. Но реальность такова, что если вы когда-нибудь даже смешно посмотрите на Фу, вы будете вызывать UB. Это настолько ужасно небезопасно, что оно того не стоит. Просто используйте своп, как и все остальные — для этого есть причина, и это потому, что это правильный выбор. Кроме того, самопроверка — это плохо.

0

По вопросам рекламы [email protected]