我正在尝试创建一个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
我该如何处理?
答案 0 :(得分:2)
嗯,您很有可能使用VS,因为它不会自动为您生成移动成员函数。 (否则ph_list.push_back(move(ph))
将起作用。)
unique_ptr
确实有移动赋值运算符,这意味着所有权转移。要调用move-assignment运算符(或移动构造函数),您需要使用rvalue。 (T&&
,其中T
在这里不作为模板,因为它调用了一些不同的东西)要获得rvalue,你要么必须使用临时(例如函数的返回值) )或者您必须手动将左值投射到右值。这是通过std::move
(表示意图)或更加冗长的static_cast
来完成的。
要解决此问题,请使用emplace_back
或手动声明正确的构造函数,并使用emplace_back
或push_back(move())
。
--- ---编辑
注意:emplace_back
可能不应该要求移动赋值构造函数工作,但在尝试从列表中提取对象时会遇到麻烦。