41
std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;

似乎在这里 p1 不再是“唯一的”,因为 p2 也引用它

它是合法的 c++ 吗?unique_ptr 有 copy_semantics 吗?如果不是,并且它只有移动语义,那么在将 p1 分配给 p2 之后是否将其设置为 NULL ?

编辑:

好的,所以正确的版本是

 p2=std::move(p1)

据此,在此分配之后, p1 无效?和 auto_ptr 的区别就在这里?明确指定所有权转移比隐含更安全,因为我猜想 auto_ptr 就是这种情况

4

3 回答 3

67

std::unique_ptr 是不可赋值和不可复制的。您需要使用 std::move();

所以

p1 = std::move(p2);

这里查看更多信息。

于 2011-04-11T14:31:34.743 回答
12

这是我写的一篇文章,它回答了你的问题。我最初写这篇文章是为了展示一个 unique_ptr 的模拟。但是,您可以忽略处理仿真的前几段,直接从“基本示例”开始阅读。

http://howardhinnant.github.io/unique_ptr03.html

编辑:

我很难将上面链接的文章提炼成小到足以以这种格式给出实际答案的内容。然而,这是我最好的镜头:

原因:通用代码的安全性。不能真正复制任何一个auto_ptrunique_ptr。考虑:

template <class T>
void foo(T t)
{
    T copy_of_t = t;  // line 4
    assert(copy_of_t == t);
}

foo通用代码看起来像上面这样并不罕见。The assert可能实际上并不存在,但假设 assert经常会持有的假设存在...... 隐含地。事实上,1996 年的一个流行实现std::sort正是具有这种逻辑,这正是促使第二次 auto_ptr重新设计的原因(这有帮助,但并没有完全解决问题)。

于 2011-04-11T15:07:24.923 回答
3

按照这个p2=p1是一个编译错误。

于 2011-04-11T14:31:45.727 回答