如何创建包含唯一指针的类的std列表

时间:2014-02-16 22:59:41

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

我正在尝试创建一个std列表,其中包含一个包含唯一指针的类列表。我一直收到一条错误消息,说明试图引用已删除的函数。

我理解问题是,唯一指针没有赋值运算符,列表正试图调用它,但我无法找到解决方法。

以下是包含指针的类的代码:

class ptr_hold
{
public:
    ptr_hold(std::list<int>& _lst);
    std::list<int>* get_list();
private:
    std::unique_ptr<std::list<int>> num_list;
};

ptr_hold::ptr_hold(std::list<int>& _lst)
{
    num_list = std::unique_ptr<std::list<int>>(new std::list<int>(_lst));
}

以下是尝试进行分配的示例代码:

list<int> lst;
for (int i = 0; i < 5; i++)
{
    lst.push_back(i);
}
ptr_hold ph = ptr_hold(lst);

list<ptr_hold> ph_list;
ph_list.push_back(ph); //error
ph_list.push_back(move(ph)); //error

我该如何处理?

1 个答案:

答案 0 :(得分:2)

嗯,您很有可能使用VS,因为它不会自动为您生成移动成员函数。 (否则ph_list.push_back(move(ph))将起作用。)

unique_ptr确实有移动赋值运算符,这意味着所有权转移。要调用move-assignment运算符(或移动构造函数),您需要使用rvalue。 (T&&,其中T在这里不作为模板,因为它调用了一些不同的东西)要获得rvalue,你要么必须使用临时(例如函数的返回值) )或者您必须手动将左值投射到右值。这是通过std::move(表示意图)或更加冗长的static_cast来完成的。

要解决此问题,请使用emplace_back或手动声明正确的构造函数,并使用emplace_backpush_back(move())

--- ---编辑
注意:emplace_back可能不应该要求移动赋值构造函数工作,但在尝试从列表中提取对象时会遇到麻烦。