考虑以下代码片段:
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 节:
-
此外,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(使用前将#替换为@)