【问题标题】:Returning a STL container of unique pointers返回唯一指针的 STL 容器
【发布时间】:2014-03-26 15:58:46
【问题描述】:

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

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

据我所知,std::array&lt;std::shared_ptr&lt;Object&gt;&gt; p_object 可以工作,但是当我尝试声明具有唯一指针的数组时出现编译器错误。这是因为 std::array 试图复制唯一指针吗?如果我想要一组唯一指针,我应该使用哪个 STL 容器?我在某处读到,最好将原始指针与 STL 容器一起使用。这是真的吗?

编辑:

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

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

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

EDIT2

错误信息显示

删除函数 'std::unique_ptr<_tp _tp_deleter>::unique_ptr(const std::unique_ptr<_tp _tp_deleter>&) [with _Tp = tp::QuadTree, _Tp_Deleter = std::default_delete, std:: unique_ptr<_tp _tp_deleter> = std::unique_ptr]' 在这里使用

'这里使用'指的是数组模板类

【问题讨论】:

  • 你遇到了什么错误?
  • 有什么问题? It seems to work as you intend.
  • 不确定这是否与我声明一个带有唯一指针的数组的事实直接相关,但我收到错误消息:“deleted function 'std::unique_ptr<_tp _tp_deleter>::unique_ptr( const std::unique_ptr<_tp _tp_deleter>&) [with _Tp = tp::QuadTree, _Tp_Deleter = std::default_delete<:quadtree>, std::unique_ptr<_tp _tp_deleter> = std::unique_ptr]'| 这里使用" '这里使用'指的是数组模板类
  • AFAIK,只要您不对需要按元素复制的容器进行操作,STL 容器就应该适用于像 unique_ptr 这样的仅可移动类型。您的示例代码适用于我,并且适用于 ideone。您的标准库版本很可能还不支持可移动元素(或未正确实现)。
  • RVO 仅适用于局部变量,不适用于数据成员(看起来如此)或其他非局部变量。这是因为局部变量在返回语句之后立即被销毁,因此可以安全地包含在返回值中。在这种情况下,您应该通过 (const-)reference 或 std::move 返回对象(如果这有意义,但在这种情况下似乎不是这样)。

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


【解决方案1】:

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

在编辑时:您可能希望像这样通过引用返回:

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); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多