std :: unique_ptr用法

Gui*_*e07 41 c++ unique-ptr c++11

std::unique_ptr<int> p1(new int);
std::unique_ptr<int> p2(new int);
p2=p1;
Run Code Online (Sandbox Code Playgroud)

在这里似乎p1不再是"唯一的",因为p2也指它

这是合法的c ++?unique_ptr有copy_semantics吗?如果不是,并且它只有移动语义,那么在将p1分配给p2后p1是否设置为NULL?

编辑:

好的,所以正确的版本是

 p2=std::move(p1)
Run Code Online (Sandbox Code Playgroud)

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

Ton*_*ion 67

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

所以

p1 = std::move(p2);
Run Code Online (Sandbox Code Playgroud)

看看这里获取更多信息.


How*_*ant 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);
}
Run Code Online (Sandbox Code Playgroud)

通用代码看起来foo如上所述并不罕见.的 assert可能是不实际存在,但前提是 assert将举行经常是有... 含蓄.实际上,一个流行的实现std::sort在1996年完全具有这个逻辑,这正是促使第二次 auto_ptr重新设计的原因(这有助于,但没有完全解决问题).