返回唯一指针的STL容器

时间:2014-03-26 15:58:47

标签: c++ c++11 unique-ptr

我不了解STL容器及其内部工作原理,但声明以下内容是否有效?

std::array<std::unique_ptr<Object>, 4> p_object;

据我所知,std::array<std::shared_ptr<Object>> p_object有效,但当我尝试使用唯一指针声明一个数组时,我遇到了编译器错误。这是因为std :: array尝试复制唯一指针吗?如果我想要一组独特的指针,我应该使用什么样的STL容器?我在某处读到,只需使用带有STL容器的原始指针就更好了。这是真的吗?

修改

我意识到错误不是源于声明数组而是来自方法:

std::array<std::unique_ptr<tp::QuadTree>, 4> get_children(){ return children; }

我猜测通过返回一个唯一指针数组,我正在创建一个唯一指针的副本。我曾假设RVO不会创建副本。我究竟应该如何重写这个功能?

EDIT2

错误消息为

删除的函数'std :: unique_ptr&lt; _Tp,_Tp_Deleter&gt; :: unique_ptr(const std :: unique_ptr&lt; _Tp,_Tp_Deleter&gt;&amp;)[with _Tp = tp :: QuadTree,_Tp_Deleter = std :: default_delete,std: :unique_ptr&lt; _Tp,_Tp_Deleter&gt; = std :: unique_ptr]'在这里使用

'此处使用'是指数组模板类

1 个答案:

答案 0 :(得分:1)

将原始指针放在std容器中显然不是一个好习惯。您的类型有效,但您有某个未经授权的不需要的副本。您需要找到该部分代码并强制执行移动操作。

关于编辑:您可能希望通过引用返回,如下所示:

std::array<std::unique_ptr<tp::QuadTree>, 4> const & get_children() const { return children; }

如果要提取值并从初始成员中删除它们,请强制执行移动操作:

std::array<std::unique_ptr<tp::QuadTree>, 4> extract_children(){ return std::move(children); }