交换优先级队列时尝试引用已删除的函数错误
Attempting to reference a deleted function error when swapping priority queues
我只是试图在两个优先级队列之间交换数据,并收到此错误。我也做了一些谷歌搜索,仍然不知道这里出了什么问题。
#include <queue>
class Node
{
public:
int idx;
};
auto greater = []( const Node& a, const Node& b) {return a.idx > b.idx; };
using QUEUE = std::priority_queue<Node, std::vector<Node>, decltype(greater)>;
void foo(QUEUE& a)
{
QUEUE b(greater);
a.swap(b);
}
int main()
{
}
以下是完整的错误消息:
错误 C2280 '
&<< lambda_07efac20ebfa61cc8bb35aebd7d81f7c>>::运算符 =(常量 << lambda_07efac20ebfa61cc8bb35aebd7d81f7c>> &(':尝试引用 已删除的函数
Lambda 没有赋值运算符,swap(( 使用赋值。它将尝试对队列中持有的较大 lambda 使用赋值。
> 在 stdlibc++(很可能是 Visual Studio 的标准库(中实现std::swap
使用老式的赋值:
swap(_Tp& __a, _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
_Tp __tmp = __a;
__a = __b;
__b = __tmp;
}
相反,libcxx 使用 std::move
实现它:
swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value &&
is_nothrow_move_assignable<_Tp>::value)
{
_Tp __t(_VSTD::move(__x));
__x = _VSTD::move(__y);
__y = _VSTD::move(__t);
}
为了交换类型std::priority_queue
的对象,您必须交换它们的比较器,这些比较器在代码中表示为 lambda。由于删除了复制赋值运算符,因此无法在 stdlibc++ 中交换 lambda。
顺便说一下,没有必要使用 lambda,因为您的捕获列表是空的。一个简单的函数就可以完成这项工作。
bool greater(const Node& a, const Node& b) {return a.idx > b.idx;};
using QUEUE = std::priority_queue<Node, std::vector<Node>, decltype(&greater)>;
void foo(QUEUE&& a)
{
QUEUE b(&greater);
a.swap(b);
}
或者,您可以将 lambda 替换为具有移动分配的可调用对象。
相关文章:
- 为什么我的双向链表删除函数会删除多个节点?
- unique_ptr实现接口时对已删除函数的引用
- 可视代码 删除函数括号内的空格
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 试图引用已删除函数数组的相等运算符
- 双链表堆栈删除函数不起作用
- 是否需要删除函数中未使用的新结构?
- C++引用已删除函数错误
- 删除函数环境中C++输入 R 对象
- 删除函数中的对象C++
- 在 C++ 中使用删除函数的不同方式
- C++错误:C2280 - 引用已删除函数的编译器错误?
- C++,删除函数/迭代进程中定义的动态数组
- 删除函数 c++ 的读取访问冲突异常
- 如何对此自定义C 列表类实现删除函数
- 双向链表问题(特别是复制构造函数和删除函数)
- 引用 std::atomic <bool>的已删除函数错误
- 在删除函数自由度的指针后,为什么我会得到核心转储
- C++删除函数
- 返回 C++11 中已删除函数的类型