考虑以下代码片段:
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
和- 如果转移前
u.d
保持状态,则该状态已转移到u2.d
。
存储指针u
的unique_ptr
对象在哪里u.p
。
第一个项目符号直接回答了问题,因为get()
指定为返回u.p
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句