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