std :: greater <int>()和std :: greater <int>之间的区别?

时间:2017-05-29 11:05:59

标签: c++ c++11 templates predicate functor

此代码有效:

#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
    priority_queue<int,vector<int>,greater<int> > pq;
    pq.push(1);
    cout<<pq.top()<<endl;
}

但是,此代码无法编译:

#include <iostream>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
int main(){
    priority_queue<int,vector<int>,greater<int>() > pq;
    pq.push(1);
    cout<<pq.top()<<endl;
}

为什么?
我理解的是greater<int>()是一个函数对象,priority_queue接受二元谓词作为第三个参数,谓词是一种特殊类型的仿函数。 但是这对括号如何产生差异呢。

2 个答案:

答案 0 :(得分:4)

在此声明中

priority_queue<int,vector<int>,greater<int> > pq;

类型模板参数greater<int>对应于结构的类型。

在此声明中

priority_queue<int,vector<int>,greater<int>() > pq;

类型模板参数greater<int>()对应于没有参数且返回类型为greater<int>

的函数的类型

类模板std::priority_queue期望参数是函数对象类型,它是指向函数的指针或具有函数运算符的类类型。

为了更清楚地比较这些声明

std::vector<int()> v1;

std::vector<int (*)()> v2;

对于第一个声明,编译器将发出错误,因为运算符sizeof可能不适用于函数类型int(),并且向量将无法为其元素分配内存。这里用作类型模板参数的int()不是表达式。这是一个类型ID。

在第二个声明中,向量处理指向函数的指针,它可以为其作为指针的元素分配内存。

答案 1 :(得分:3)

来自cppreference

template<
     class T,
     class Container = std::vector<T>,
     class Compare = std::less<typename Container::value_type>
 > class priority_queue;
  

比较 - 比较类型提供严格的弱排序。

因此,对于 std :: priority_queue ,您将一种比较器作为模板参数传递。

另一方面,

greater<int>()

代表greater<int>类型的新对象的创建,在您的情况下不是一个选项。