【问题标题】:Is unique_ptr guaranteed to store nullptr after move?unique_ptr 是否保证在移动后存储 nullptr?
【发布时间】:2014-07-26 12:57:00
【问题描述】:

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 离开元素的状态。我认为智能指针的末端也没有任何保证。也就是说,我将把它留给 CPP 专家来回答:)
  • 等等,没关系,是的。 Release 明确地将其设置为 nullptr。 unique_ptr 保证了这一点
  • gcc 4.8.1 这里,p1 在 std::move 之后为空
  • std::unique_ptr::operator:std::unique_ptr::release 上查看任何参考资料。
  • 只看移动语义...

标签: c++ c++11 move-semantics unique-ptr


【解决方案1】:

是的,您可以在move 之后将其与nullptr 进行比较,并保证比较相等。

来自 §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 p2{std::move(p1)} 正在从p1 移动构造p2。这就是我上面引用的文本中的要求的所有权转让。移动构造函数实现将确保满足所有后置条件。
  • 谢谢。改写:使用move构造函数请求所有权转移,并且必须保持p1的不变量。 std::move 只是允许使用移动构造函数。
【解决方案2】:

是的。来自 C++2011 标准节20.7.1/4

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

【讨论】:

    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多