Рассмотрим следующий код:
#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
.
Я почти уверен, что мне что-то не хватает в моих рассуждениях, но я не могу понять, что не так.
Это безопасная операция? Где стандарт успокаивает меня об этом?