Доброго времени суток!
Вот, перечитывая D&E, Страуструп пишет, что он, случалось, забывал проверку на присвоение объекта самому себе в ранние годы C with classes, когда он только начинал обдумывать семантику деструктивного присваивания. Тут решил глянуть
сабж, и увидел такое:
template<class T>
class Handle {
T* p;
public:
Handle(T* pp) : p{pp} {}
~Handle() { delete p; } // user-defined destructor: no implicit copy or move
Handle(Handle&& h) :p{h.p} { h.p=nullptr; }; // transfer ownership
Handle& operator=(Handle&& h) { delete p; p=h.p; h.p=nullptr; return *this; } // transfer ownership
Handle(const Handle&) = delete; // no copy
Handle& operator=(const Handle&) = delete;
// ...
};
Я таки не понял, в выделенном опять же нет проверки на присваивание самому себе: это опечатка, или как?
Handle<int> foo(new int(10));
Handle<int>& bar = foo;
// ... много-много кода
foo = std::move(bar); // Ужас. Или все-таки нет?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)