有人可以解释为什么我的编译器(GCC)接受下面的代码是有效的吗?
priority_queue<int, deque<int>, less<int>> pq(greater<int>());
我希望这个构造函数(对于less<int>
为Comparator
的类型的实例,如priority_queue
实例pq
所指定的那样)与{{的实例不兼容1}}(作为构造函数参数传递),这是与greater<int>
不同的类型。但是GCC出于某种原因接受了这个......
答案 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>{});
// ^^