提升文档页面reads
scoped_ptr
无法在C ++标准库容器中使用。如果您需要可以使用的智能指针,请使用shared_ptr
。
我认为不可复制会成为scoped_ptr
的障碍但是从c ++ 11开始,就某些容器而言,我们可以:< / p>
emplace_back
等那么scoped_ptr无法用于STL容器的原因是什么?
答案 0 :(得分:4)
文档有些过时了。 Boost.ScopedPtr
是一个旧库,维护人员不关心将文档与C ++的最新发展保持同步。
理论上,类似scoped_ptr
的类可以起作用(由std::unique_ptr
证明);但实际上,boost::scoped_ptr
不能在许多标准容器中有用,因为它有一个私有拷贝构造函数而没有移动构造函数。特别是,std::vector
和std::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
代表了唯一的所有权。