使用相同的 unique_ptr 执行 std::move 两次

use*_*264 6 c++ move unique-ptr

如果我使用相同的 unique_ptr 两次调用 std::move 会发生什么?

unique_ptr<int> foo(new int(5));
unique_ptr<int> bar = move(foo);
unique_ptr<int> baz = move(foo);
Run Code Online (Sandbox Code Playgroud)

PS:不,std::unique_ptr 的用法不是同一个问题。这两个问题都是关于unique_ptr的,这是他们之间唯一的共同点。

acr*_*075 12

从 a 移动unique_ptr使其为空。所以baz最终也会为空。


Nat*_*ica 8

本质上,什么都没有。标准库要求移动库类型使其处于有效但未指定的状态。有效意味着您仍然可以对不需要先决条件的对象执行操作。那就是给它分配一个新值或销毁它。因为unique_ptr我们实际上得到了更多的状态保证,因为移动构造函数保证移动的对象被设置为nullptr。这意味着在所有这一切的最后都bar持有指针 并且foobaz都是nullptr