std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;
这里p1似乎不再是"唯一的",因为p2也引用它
它是合法的c++ ?unique_ptr有copy_semantics吗?如果没有,如果它只有移动语义,是p1设置为NULL后分配给p2 ?
编辑:正确的版本是
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_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
重新设计(这有帮助,但是没有完全解决问题)。
按此,p2=p1
是一个编译错误。