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就是这样我猜
答案 0 :(得分:67)
答案 1 :(得分:12)
这是我写的一篇文章,回答了你的问题。我最初写这篇文章是为了展示unique_ptr的模拟。但是,您可以忽略处理仿真的前几段,然后开始阅读“基本示例”。
http://howardhinnant.github.io/unique_ptr03.html
修改强>
我无法将上面链接的文章提炼到足够小的东西,以便以这种格式做出实际答案。然而,这是我最好的镜头:
原因:通用代码的安全性。 人们无法真正复制
auto_ptr
或unique_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)
根据this,p2=p1
是编译错误。