是否可以保证unique_ptr在移动后存储nullptr?


78

unique_ptr保证存储nullptr移动之后?

std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?

2
从技术上讲::move离开元素的状态是不确定的。我也不认为智能指针的末端有任何保证。就是说,我
将由

1
等等,没关系,是的。Release明确将其设置为nullptr。unique_ptr
Benjamin Gruenbaum 2014年

gcc 4.8.1在这里,在std :: move之后
2014年


只看一下移动语义...
重复数据删除器

Answers:


70

是的,你可以把它比作nullptrmove,并保证为比较相等。

§20.8.1/ 4 [unique.ptr]

另外,u可以根据要求将所有权转移到另一个唯一的指针u2。完成此类转移后,以下后置条件成立:
u2.p等于转移前u.p
u.p等于nullptr,并且
...

(该成员p先前被描述为-唯一指针是u存储指向第二个对象的指针的对象p


在调用release()之后,这显然是正确的。但是std :: move不调用release()。那么,编译器如何知道如何还原unique_ptr的不变式?
mabraham

1
@mabrahamp2{std::move(p1)}正在p2从构建p1。这就是我在上面引用的文本中要求的所有权转让。move构造函数的实现将确保满足所有后置条件。
Praetorian

谢谢。改写:使用move构造函数要求所有权转移,并且必须保持p1的不变性。std :: move仅允许使用move构造函数。
mabraham

10

是。从C ++ 2011 Standard Section 20.7.1 / 4

另外,您可以根据请求将所有权转移到另一个唯一指针u2。在完成这样的传输后,以下后置条件成立[source unique_ptr]等于nullptr ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.