Рассмотрим следующий код:О сейфовые операции с участием уникальных указателей
#include <memory>
struct Foo { std::unique_ptr<Foo> next; };
void f(Foo &foo) { foo = std::move(*foo.next); }
int main() {
Foo foo{};
foo.next = std::make_unique<Foo>();
foo.next->next = std::make_unique<Foo>();
f(foo);
}
Поступая foo = std::move(*foo.next);
, foo.next.next
перемещается в foo.next
.
Если foo.next
признан недействительным в качестве первого шага, объект, на который он указывает, может быть удален немедленно. Это приведет к удалению foo.next.next
, то есть объекта, который я пытаюсь переместить в foo.next
.
Я почти уверен, что в моих рассуждениях что-то не хватает, но я не могу понять, что случилось.
Безопасная операция? Где стандарт меня успокаивает?