priority_queue lambda
七月 04, 2022 [c++] #c++priority_queue lambda
优先级队列priority_queue使用lambda表达式出错问题
以下代码在c++17中报错,c++20中正常
#include <iostream>
#include <queue>
int main() {
std::cout << "hello test" << std::endl;
using Ty = std::pair<std::string,int>;
struct myGreater {
bool operator() (Ty a, Ty b){
return std::tie(a.second, a.first) > std::tie(b.second, b.first);
}
}; // 可以使用仿函数代替lambda在priority_queue中使用
std::priority_queue<Ty,
std::vector<Ty>,
decltype([](Ty a, Ty b)->bool{
return std::tie(a.second, a.first) > std::tie(b.second, b.first);
})> q;
q.emplace(std::make_pair("yang",3));
q.emplace(std::make_pair("yong",2));
q.emplace(std::make_pair("zhen",1));
std::cout << "q.top()=" <<q.top().first <<std::endl;
return 0;
Your code is valid C++20 as written but invalid C++17 or earlyer. 可能你使用了c++20的特性,在c++20之前不支持。
在 C++20 之前闭包类型不是默认可构造的。在 C++20 中没有捕获的闭包类型是默认可构造的。
1.Lambda expressions are not allowed in unevaluated contexts (such as decltype) before C++20. 2.Closure types are not default constructible before C++20. In C++20 a closure type that has no capture is default constructible.