默认使用 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);