【发布时间】:2018-10-30 13:03:03
【问题描述】:
以下代码将无法编译:
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>> &)':试图 引用已删除的函数
有没有办法对unique_ptr 的列表进行排序,或许可以使用移动构造函数来代替?
【问题讨论】:
-
这看起来很像试错法 C++,往往不太顺利。你应该退后一步,从一本好书中系统地学习语言。
-
你不能复制 unique_ptr's 和 ptrLess 使用按值传递,所以会尝试创建副本。将参数更改为 const refs,它应该可以工作。
-
顺便说一句,你还有一个类
list和一个变量list在同一个范围内,很容易给你带来问题 -
@Zach 好的,那可能是你老师的错。作为一个忠告:链表现在很少有用了,因为它们在几乎所有事情上都非常缓慢。是的,这通常包括在中间插入;当您在列表中找到插入点时,您将很快完成围绕
std::vector元素的移动。教学人员似乎普遍低估了这一点。 -
请注意,如果您要为您的
ptrLess使用移动构造函数,那么ptrLess函数将拥有它正在比较的指针。然后,当函数结束时,将没有所有者,unique_ptr析构函数将删除所指向的任何内容。您的结果将是一个(技术排序的)空unique_ptrs 列表。
标签: c++ smart-pointers