首页 > 解决方案 > 对 unique_ptrs 列表进行排序

问题描述

以下代码将无法编译:

bool ptrLess(unique_ptr<int> ptr1, unique_ptr<int> ptr2)
{
   return *ptr1 < *ptr2;
}

int main()
{
   unique_ptr<int> ptr1(new int(3));
   unique_ptr<int> ptr2(new int(2));
   unique_ptr<int> ptr3(new int(5));
   list<unique_ptr<int>> list;

   list.push_back(ptr1);
   list.push_back(ptr2);
   list.push_back(ptr3);

   list.sort(ptrLess);

   for (auto &element : list) {
      cout << *element;
   }

   return 0;
}

我认为这是因为unique_ptr' 的复制构造函数被删除了。我收到如下错误:

错误 C2280:'std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)':试图引用已删除的函数

有没有办法对unique_ptr's 的列表进行排序,也许是通过使用移动构造函数来代替?

标签: c++smart-pointers

解决方案


您应该使用 const ref - 毕竟您不想修改这些指针:

bool ptrLess(const unique_ptr<int>& ptr1, const unique_ptr<int>& ptr2)

如果您的list模板是std::list,则将参数作为 r 值引用传递将不起作用 -list::sort必须调用std::move有效地重置您的指针。

编辑

至于列出您的其余代码:std::list有一个方便的方法,称为emplace_back(and emplace_front),它允许您就地构造和附加元素:

your_list.emplace_back(new int(2));

推荐阅读