繁体   English   中英

std :: unique_ptr用法

[英]std::unique_ptr usage

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是这种情况

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经常持有的假设是...... 隐含的 实际上,一个流行的std::sort实现在1996年完全具有这个逻辑,这正是促使第二次auto_ptr重新设计的原因(这有助于,但没有完全解决问题)。

按照p2=p1是编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM