是否可以保证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

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

从§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.