【发布时间】:2020-05-14 20:05:47
【问题描述】:
我有一个优先级队列定义在 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;
【问题讨论】:
-
在 c++20 之前,lambda 不能默认构造。
-
只是补充@rafix07 注释,
std::priority_queue的第三个模板参数接收一个类型,而不是一个值。然后在内部std::priority_queue将从该类型创建一个 lambda。这只有在 C++20 版本之后才有可能,其中允许默认构造的 lambda。事实上,我认为这个特殊用例是使 lambdas 默认可构造的主要动机。