为什么scoped_ptr可以与STL容器一起使用?

时间:2014-05-24 11:27:12

标签: c++ c++11 boost stl containers

提升文档页面reads

  

scoped_ptr 无法在C ++标准库容器中使用。如果您需要可以使用的智能指针,请使用 shared_ptr

我认为不可复制会成为scoped_ptr的障碍但是从c ++ 11开始,就某些容器而言,我们可以:< / p>

  • 使用emplace_back
  • 构建
  • 移动资源而不复制

那么scoped_ptr无法用于STL容器的原因是什么?

2 个答案:

答案 0 :(得分:4)

文档有些过时了。 Boost.ScopedPtr是一个旧库,维护人员不关心将文档与C ++的最新发展保持同步。

理论上,类似scoped_ptr的类可以起作用(由std::unique_ptr证明);但实际上,boost::scoped_ptr不能在许多标准容器中有用,因为它有一个私有拷贝构造函数而没有移动构造函数。特别是,std::vectorstd::deque要求其内容可移动构造。

scoped_ptr 可以在基于节点的容器中使用(因为这样的容器不要求其内容是可移动构造的),如果只是容器的有限子集,那么可以使用。使用s接口。以下代码有效:

std::list<boost::scoped_ptr<int>> list;
list.emplace_back(new int(16));

std::map<int, boost::scoped_ptr<int>> map;
map.emplace(
    std::piecewise_construct,
    std::forward_as_tuple(10),
    std::forward_as_tuple(new int(14)));

即便如此,与仅使用std::unique_ptr相比,这是不必要的痛苦(因为使用std::unique_ptr将允许您使用更大比例的标准容器的接口)。

答案 1 :(得分:3)

由于州是文件,

  

它提供了一个基本的&#34;资源获取是初始化&#34;设施,没有共享所有权或转让所有权语义。它的名称和语义的强制执行(通过不可复制)表明其意图仅在当前范围内保留所有权。

  

Q值。为什么scoped_ptr没有release()成员?
  答:在阅读源代码时,能够根据所使用的类型得出关于程序行为的结论是很有价值的。如果scoped_ptr有一个release()成员,则可以转移所保持指针的所有权,削弱其作为限制资源生命周期到给定上下文的方式的作用。

scope_ptr存在比已弃用的auto_ptr更安全并代表RAII。 现在,在C ++ 11中,我们std::unique_ptr代表了唯一的所有权。