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设置为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是一个编译错误。

相关内容

  • 没有找到相关文章

最新更新