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?
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?
是的,在move
之后,您可以将其与nullptr
进行比较,并且保证它们相等。
来源于§20.8.1/4 [unique.ptr]
此外,
u
可以在请求时将所有权转移给另一个唯一指针u2
。完成此类转移后,会满足以下后置条件:
—u2.p
等于转移前的u.p
,
—u.p
等于nullptr
,并且
...
(成员p
早些描述为—一个唯一指针是存储对第二个对象p
的指针的对象u
)
p2{std::move(p1)}
是将 p1
移动构造到 p2
。这就是我在引用的文本中所说的所有权转移请求。移动构造函数的实现将确保满足所有后置条件。 - Praetorian是的。来自C++2011标准第20.7.1/4节:
此外,您可以根据要求将所有权转移给另一个唯一指针u2。完成此类转移后,以下后置条件成立[源唯一指针]等于nullptr...
::move
离开元素的状态是未指定的。我认为智能指针也没有任何保证。话虽如此,我会留给 CPP 专家来回答 :) - Benjamin Gruenbaumunique_ptr
保证的。 - Benjamin Gruenbaumstd::unique_ptr::operator:
和std::unique_ptr::release
的任何参考资料。 - rubenvb