我不了解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]'在这里使用
'此处使用'是指数组模板类
答案 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); }