使用不同类型的比较实例构造 priority_queue 个实例

Constructing priority_queue instance with Compare instance of different type

谁能解释一下为什么我的编译器 (GCC) 接受下面的代码是有效的?

priority_queue<int, deque<int>, less<int>> pq(greater<int>());

我希望此构造函数(对于具有 less<int> 作为 Comparator 的类型的实例,如为 priority_queue 实例 pq 所指定)与的实例不兼容greater<int>(作为构造函数参数传递),与 less<int> 不同的类型。但是 GCC 出于某种原因接受了这个...

下面的语句:

priority_queue<int, deque<int>, less<int>> pq(greater<int>());

实际上被编译器解析为 声明 pq 函数,returns 是 priority_queue 的一个实例,并且需要一个单个参数,是指向不带参数的函数的指针,returns 是 greater<int> 类型的实例。这被称为 Most-vexing parse

如果你写:

你会看到一个错误
priority_queue<int, deque<int>, less<int> > pq((greater<int>()));
//                                             ^              ^ 

或(在 C++11 中):

priority_queue<int, deque<int>, less<int>> pq(greater<int>{});
//                                                        ^^