【问题标题】:how to make a std list of a class that contains unique pointers如何制作包含唯一指针的类的标准列表
【发布时间】:2014-02-16 22:59:41
【问题描述】:

我正在尝试创建一个标准列表,该列表将包含一个包含唯一指针的类列表。我不断收到一条错误消息,提示您尝试引用已删除的函数。

我知道问题是唯一指针没有赋值运算符,并且 list 试图调用它,但我无法找到解决方法。

下面是保存指针的类的代码:

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

我该如何处理?

【问题讨论】:

  • ph_list.emplace_back(lst);
  • 实际上,ph_list.push_back(move(ph)); 适合我。但是emplace_back 更好。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • @dyp 注意并更改,谢谢。另外我发誓我在您发表评论之前就已经回答了。
  • 顺便说一句,您在编辑部分答案时不需要添加“--edit--”或“[edit]”,有一个revision history,阅读时还有一个通知其他人答案,它刚刚被编辑过。
  • @dyp 我知道,但我觉得它的目的是快速直观地指示应在帖子中指出的更改,或者可能是稍后想到的注释/评论。 (或者也许我正在合理化来自不同论坛的习惯。:-))
  • 我尝试了带有和不带有移动功能的 emplace_back,但这对我不起作用。我不熟悉右值,所以我现在正在阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多