std::unique_ptr::get 返回的值在移动 unique_ptr 后有效吗?

Is value returned by std::unique_ptr::get valid after moving unique_ptr?

考虑以下代码片段:

class Owner {
public:
 Owner(std::unique_ptr<int> ptr) : owned_pointer<int>(std:move(ptr)) {}
private:
 std::unique_ptr<int> owned_pointer;
};


std::unique_ptr<int> ptr(new int);
int* ptr1 = ptr.get();
Owner new_owner(std::move(ptr));

只要 new_owner 在范围内,就可以假设 ptr1 有效吗?它似乎有效,但我找不到明确说明的规范 - 它是否未定义 behavior/implementation 具体并且恰好对我有用,或者上面发布的代码有效(ptr1 保证指向移动指针,只要它还活着)?

是的,有效。

您可以有多个(普通)指针指向同一个对象。问题是这些指针的有效期有多长,或者指向的对象何时被删除。

A unique_ptr 存储一个更多的普通指针并取得所有权,这意味着它负责对象何时被销毁。将它移动到另一个 unique_ptr 只是转移了所有权,对象本身仍然是相同的并且指向它的所有普通指针仍然有效。

只有当所有权没有转移(或释放)并且拥有的unique_ptr被销毁时,它也会销毁对象。这将是指向该对象的所有普通指针都变成悬挂指针并且取消引用它们将是非法的。

是的,C++11 规范保证将一个对象的所有权从一个unique_ptr转移到另一个unique_ptr不会改变对象的位置对象本身,并且第二个 unique_ptr returns 上的 get() 与传输前第一个 unique_ptr 上的相同。

查看 N3337,第 20.7.1 节:

  1. Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of such a transfer, the following postconditions hold:

    • u2.p is equal to the pre-transfer u.p,
    • u.p is equal to nullptr, and
    • if the pre-transfer u.d maintained state, such state has been transferred to u2.d.

其中 u 是存储指针 u.punique_ptr 对象。

第一个项目符号直接回答了问题,因为 get() 被指定为返回 u.p