Lambda 函数在 C++ 中的priority_queue中不起作用(使用 [&] 时)
lambda function doesn't work in priority_queue in c++ (when using [&])
当我做 Leetcode.com 时,无法编译以下代码。
auto cmp=[&](pair<int,int> a, pair<int,int> b){return heightMap[a.first]
[a.second]<heightMap[b.first][b.second];};
priority_queue<pair<int,int>,vector<pair<int,int>>,decltype(cmp)> pq;
当我使用
auto cmp=[](...){return true;}.
但我必须使用
auto cmp=[&](...){...}
因为我需要在函数中访问高度图。
我不知道为什么不能编译
我假设您正在块范围内工作(即在函数内部(。
对于[&]
和[]
情况,正确的代码应该是:
priority_queue<pair<int,int>,vector<pair<int,int>>, decltype(cmp)> pq(cmp);
// ^^^^^
您可以在 cpp首选项示例中看到这一点。
如果你仔细想想,只有decltype(cmp)
的pq
的定义不可能知道任何局部变量——这种依恋只是在实际创建cmp
时形成的。
原因是priority_queue
的默认构造函数是(C++17 [priqueue.cons](:
explicit priority_queue(const Compare& x = Compare(), Container&& y = Container());
如您所见,这涉及默认构造类型Compare
的对象。在 C++20 之前,lambda 不是默认可构造的。
无状态 lambda 的默认构造是由 P0624 添加的,它没有完全进入 C++17,但现在确实出现在 C++20 草案中。
从技术上讲,C++17编译器甚至应该拒绝[]
版本;但似乎一些编译器已经在C++20支持方面领先一步。
我注意到 clang++ 6.0.0 实际上允许默认构造指定为[&]
的 lambda,当它发生没有实际捕获变量时;而 P0624 的措辞说这种情况应该被拒绝。也许在 C++20 最终确定之前,这种情况会再次改变。
相关文章:
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- 使用 va_arg 传递给函数va_list不起作用
- 为什么使用数组元素查找最大数字的程序不起作用?
- 组合正则表达式部分使用 | 不起作用的 C++
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 将新放置与 std::函数一起使用不起作用
- 尝试使用C++中的模板进行BST排序,但在使用随机字符串进行测试时不起作用
- 为什么必须使用'*p=a',而使用'p=&a'在构造函数中不起作用
- QObject::连接不起作用 - 使用函数语法找不到信号
- 使用选择排序对数组数据结构进行排序,但它不起作用
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- 使用片段着色器写入 1D 纹理后从 1D 纹理读回不起作用
- 为什么当我对数组使用增量操作时,do for 循环不起作用
- C++ 使用递归回溯的数独求解器不起作用
- 使用sscaf_s从obj读取顶点线不起作用
- 我可以使用常量定义数组的长度,那么为什么 int d[b] 不起作用呢?
- 替换所有使用不起作用
- 为什么这种将emplace_back与已删除的复制构造函数一起使用不起作用?