请考虑以下代码:
#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
的那个对象。我很确定我的推理中漏掉了什么,但我想不出哪里错了。
这个操作是安全的吗?标准在哪里保证了这一点?