在 std::move() 之后 unique_ptr 会发生什么?

新手上路,请多包涵

这段代码是我想要做的:

 Tony& Movie::addTony()
{
    Tony *newTony = new Tony;
    std::unique_ptr<Tony> tony(newTony);
    attachActor(std::move(tony));
    return *newTony;
}

我想知道我是否可以这样做:

 Tony& Movie::addTony()
{
    std::unique_ptr<Tony> tony(new Tony);
    attachActor(std::move(tony));
    return *tony.get();
}

但是 *tony.get() 会是同一个指针还是空?我知道我可以验证,但它的标准做法是什么?

原文由 user3496846 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 752
1 个回答

不,你不能这样做。移动 unique_ptr 使其归零。如果没有,那么它就不是独一无二的。我当然假设 attachActor 不会做这样愚蠢的事情:

 attachActor(std::unique_ptr<Tony>&&) {
    // take the unique_ptr by r-value reference,
    // and then don't move from it, leaving the
    // original intact
}

第 20.8.1 节第 4 段。

此外,u(unique_ptr 对象)可以根据请求将所有权转移到另一个唯一指针 u2。完成此类转让后,以下后置条件成立:

-- u2.p等于pre-transfer up,

-- up 等于 nullptr ,并且

-- 如果前转移的ud保持状态,则该状态已转移到u2.d。

原文由 Benjamin Lindley 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题