使用不同类型的Compare实例构造priority_queue实例

时间:2015-06-15 21:07:02

标签: c++ gcc constructor containers

有人可以解释为什么我的编译器(GCC)接受下面的代码是有效的吗?

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

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

1 个答案:

答案 0 :(得分:1)

以下声明:

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

实际上被编译器解析为pq函数的声明,它返回priority_queue的实例,并且它接受一个参数,作为函数的指针不带参数,返回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>{});
//                                                        ^^