移动 unique_ptr 后 std::unique_ptr::get 返回的值是否有效?

2024-04-15

考虑以下代码片段:

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 有效吗?它似乎有效,但我找不到明确说明的规范 - 是否特定于未定义的行为/实现并且恰好对我有用,或者上面发布的代码是有效的(保证 ptr1 指向移动的指针,如只要它还活着)?


是的,C++11 规范保证从一个人手中转移一个对象的所有权unique_ptr到另一个unique_ptr不会改变物体本身的位置,并且get()在第二个unique_ptr返回与第一个相同的结果unique_ptr转移之前。

查看 N3337,第 20.7.1 节:

  1. 此外,u可以根据要求,所有权转让到另一个唯一的指针u2。完成该等转让后,如下 后置条件成立:

    • u2.p等于预传输u.p,
    • u.p等于nullptr, and
    • 如果预转移u.d保持状态,该状态已转移到u2.d.

where u is a unique_ptr存储指针的对象u.p.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

移动 unique_ptr 后 std::unique_ptr::get 返回的值是否有效? 的相关文章

随机推荐