lambda在C+上失败+;14/17,并适用于更高版本

lambda在C+上失败+;14/17,并适用于更高版本,lambda,c++17,c++20,Lambda,C++17,C++20,我有一个优先级队列定义在C++14/17上失败,但可以使用更高的标准。 有人能告诉我为什么吗 auto compare = [](const pair<int, int>& p1, const pair<int, int>& p2) { return p1.second < p2.second; }; // compile failure on C++ 14/17 priority_queue<

我有一个优先级队列定义在C++14/17上失败,但可以使用更高的标准。 有人能告诉我为什么吗

    auto compare = [](const pair<int, int>& p1, const pair<int, int>& p2) {
        return p1.second < p2.second;
    };

    // compile failure on C++ 14/17 
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(compare)> pq;
auto-compare=[](常量对和p1、常量对和p2){
返回p1.second
我可以问一个未来的问题吗?为什么lambda的第一个案例是好的,但第二个是错的:

auto comp = [&](const pair<string,int>& a, const pair<string,int>& b) {
    return a.second > b.second || (a.second == b.second && a.first < b.first);
};
// OK!!!
// typedef priority_queue< pair<string,int>, vector<pair<string,int>>, decltype(comp)> my_priority_queue_t;
// my_priority_queue_t  pq(comp);

// BOMB!!!
priority_queue< pair<string,int>, vector<pair<string,int>>, decltype(comp)> pq;
auto comp=[&](常数对&a,常数对&b){
返回a.second>b.second | |(a.second==b.second&&a.firstmy_priority_queue;
//我的优先权队列pq(comp);
//炸弹!!!
优先级队列pq;

您调用以下
优先级队列的构造函数

priority\u queue():priority\u queue(Compare(),Container()){}

从。正如您所见,它调用了
Compare()
——comparator的默认构造函数,在您的例子中,它是闭包类型。但在C++20之前,闭包不是默认可构造的。这就是为什么这个重载构造函数不起作用

自C++20以来,这一切都很好,因为闭包具有:


在c++20之前,

lambda不是默认可构造的。仅补充@rafix07 comment,
std::priority_queue
的第三个模板参数接收类型,而不是值。然后,内部
std::priority_queue
将从该类型创建lambda。这只有在C++20版本之后才可能实现,其中lambdas允许默认可构造。事实上,我认为这个特定的用例是使lambdas默认可构造的主要动机。
ClosureType() = default;
(since C++20)(only if no captures are specified)