C++ lambda函数不';t在c+中的优先级队列中工作+;(使用[&;]时)

C++ lambda函数不';t在c+中的优先级队列中工作+;(使用[&;]时),c++,lambda,priority-queue,C++,Lambda,Priority Queue,当我在做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>>,declty

当我在做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=[&](...){...}
因为我需要在函数中访问heightMap


我不知道为什么不能编译它

我假设您在块范围内工作(即在函数内部)

对于
[&]
[]
两种情况,正确的代码应该是:

priority_queue<pair<int,int>,vector<pair<int,int>>, decltype(cmp)> pq(cmp);
//                                                                   ^^^^^
如您所见,这涉及默认构造类型为
Compare
的对象。在C++20之前

无状态lambdas的默认构造是由它添加的,它没有完全进入C++17,但现在出现在C++20草稿中

从技术上讲,C++17编译器甚至应该拒绝
[]
版本;但似乎有些编译器已经在C++20支持上取得了突破


我注意到,clang++6.0.0实际上允许默认构造指定为
[&]
的lambda,但实际上没有捕获任何变量;鉴于P0624的措辞表示应拒绝该案例。在C++20最终确定之前,这可能会再次发生变化。

请发布一篇文章<代码>[&]不能在命名空间范围内使用;在block scope中,我不相信无状态lambda可以工作,它与捕获
高度映射的lambda存在相同的问题。请在某些上下文中发布@Praetorian的
[]
版本,网址为least@M.M因为您不是像OP那样默认构造
优先级队列
。在名称空间范围内捕获有什么不对?@M.M看起来好像clang是对的——想想看,这很有意义,因为在lambda中使用它不需要捕获全局。非常感谢您的详细解释!
priority_queue<pair<int,int>,vector<pair<int,int>>, decltype(cmp)> pq(cmp);
//                                                                   ^^^^^
explicit priority_queue(const Compare& x = Compare(), Container&& y = Container());