默认使用 lambda 构造 std::priority_queue
Default constructed std::priority_queue with a lambda
我在定义 std::priority_queue
时 错误地 省略了 compare
参数:
#include <queue>
int main()
{
constexpr auto cmp{[](int a, int b) { return a > b; }};
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq;
}
,编译成功,用它实现Dijkstra算法时也能正常工作。
然后才发现我在构造pq
.
的时候只传递了cmp
的类型信息
但是,只有在使用 --std=c++20
标志时,代码才能编译。
我浏览了 cppreference.com
上的 priority_queue 参考,但找不到关于自 C++20 以来发生的更改的任何通知。
我使用了以下版本的g++
:
g++ (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
这是自 C++20 以来的预期行为吗?如果是,是什么影响了此更改?
更改发生在 lambdas。
If no captures are specified, the closure type has a defaulted default constructor. Otherwise, it has no default constructor (this includes the case when there is a capture-default, even if it does not actually capture anything). (Since C++20)
在C++20之前,lambda闭包类型不是DefaultConstructible,比较器对象不能在std::priority_queue
的默认构造函数中默认构造,然后您必须将 lambda 对象传递给 std::priority_queue
获取比较对象的构造函数。
constexpr auto cmp{[](int a, int b) { return a > b; }};
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq(cmp);
我在定义 std::priority_queue
时 错误地 省略了 compare
参数:
#include <queue>
int main()
{
constexpr auto cmp{[](int a, int b) { return a > b; }};
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq;
}
,编译成功,用它实现Dijkstra算法时也能正常工作。
然后才发现我在构造pq
.
cmp
的类型信息
但是,只有在使用 --std=c++20
标志时,代码才能编译。
我浏览了 cppreference.com
上的 priority_queue 参考,但找不到关于自 C++20 以来发生的更改的任何通知。
我使用了以下版本的g++
:
g++ (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
这是自 C++20 以来的预期行为吗?如果是,是什么影响了此更改?
更改发生在 lambdas。
If no captures are specified, the closure type has a defaulted default constructor. Otherwise, it has no default constructor (this includes the case when there is a capture-default, even if it does not actually capture anything). (Since C++20)
在C++20之前,lambda闭包类型不是DefaultConstructible,比较器对象不能在std::priority_queue
的默认构造函数中默认构造,然后您必须将 lambda 对象传递给 std::priority_queue
获取比较对象的构造函数。
constexpr auto cmp{[](int a, int b) { return a > b; }};
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq(cmp);