std :: 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? 如果不是,并且只有移动语义,则在将其分配给p2后将p1设置为NULL?

编辑:

好的,所以正确的版本是

  p2=std::move(p1) 

据此,在这个分配之后,p1是无效的? 和auto_ptr的区别在这里? 我认为明确地明确所有权的转移是比auto_ptr更为安全

std :: unique_ptr是不可分配和不可复制的。 你需要使用std :: move();

所以

 p1 = std::move(p2); 

在这里看看更多的信息。

这是我写的一篇文章,可以回答你的问题。 我最初写这篇文章来介绍一个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经常会持有的假设是隐含的 。 事实上,一个stream行的std::sort实现在1996年正好是这个逻辑,这正是促使第二个auto_ptr重新devise(帮助,但没有完全解决问题)的原因。

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