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.