std :: unique_ptr用法

时间:2011-04-11 14:27:22

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

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后p1是否设置为NULL?

修改

好的,所以正确的版本是

 p2=std::move(p1)

据此,在此分配后,p1无效?与auto_ptr的区别在哪里?明确规定所有权转让比隐式更安全,因为auto_ptr就是这样我猜

3 个答案:

答案 0 :(得分:67)

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

所以

p1 = std::move(p2);

查看here了解更多信息。

答案 1 :(得分: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。该   实际上assert可能不是   那里,但假设   assert会经常举行......   隐式。实际上,std::sort的流行实现了   确切地说,这是1996年的逻辑   究竟是什么促使了第二个   auto_ptr重新设计(有帮助,但是   没有完全解决问题)。

答案 2 :(得分:3)

根据thisp2=p1是编译错误。