带标准容器的unique_ptr:尝试引用已删除的函数

时间:2015-02-28 20:51:27

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

我正在尝试将unique_ptr与任何stl容器一起使用(实际上list更适合我),我看到unique_ptr需要移动语义。 这个代码,其中employee是基类:

typedef std::unique_ptr<employee> p_employee;

std::list<p_employee> make_test_array() {
    std::list<p_employee> objects = {
       p_employee(new accounter(...)),
       p_employee(new engineer(...)),
       p_employee(new developer(...))
    };

    return objects;
}

你看到我正在尝试做什么 - 只需从函数中返回此列表

那么有能力做到这一点吗?什么是正确的技术?

1 个答案:

答案 0 :(得分:4)

您正在尝试使用带有std::list<p_employee>参数的std::list构造函数构造std::initializer_list<p_employee>

不幸的是,std::initializer_list只允许const访问其元素,这意味着编译器会尝试复制失败的每个p_employee(或std::unique_ptr<employee>),因为{{1} 1}}是一种只移动类型,无法复制。

如果您将 braced-init-list 替换为一系列unique_ptr / emplace_back来电,您的代码应该有效。

push_back