lambda 在 C++14/17 上失败并在更高版本上工作

lambda failed on C++14/17 and works on later version

我有一个优先级队列定义在 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;

我可以再问一个问题吗?为什么第一个用 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;

您调用 priority_queue 的以下构造函数:

priority_queue() : priority_queue(Compare(), Container()) { }

来自 reference。如您所见,它调用 Compare() - 比较器的默认构造函数,在您的情况下是闭包类型。但在 C++20 之前,闭包不是默认可构造的。这就是为什么这种构造函数重载不起作用的原因。

从 C++20 开始这一切都很好,因为闭包有:

ClosureType() = default;
(since C++20)(only if no captures are specified)

来自 lambdas reference.