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

Man*_*har 7 c++ templates predicate functor c++11

此代码有效:

#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;
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码无法编译:

#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;
}
Run Code Online (Sandbox Code Playgroud)

为什么?
我所了解的是,它greater<int>() 是一个函数对象,并且priority_queue接受二进制谓词作为第三个参数,并且谓词是一种特殊的函子类型。但是这对大括号如何使这一点有所不同。

Vla*_*cow 7

在此声明中

priority_queue<int,vector<int>,greater<int> > pq;
Run Code Online (Sandbox Code Playgroud)

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

在此声明中

priority_queue<int,vector<int>,greater<int>() > pq;
Run Code Online (Sandbox Code Playgroud)

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

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

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

std::vector<int()> v1;
Run Code Online (Sandbox Code Playgroud)

std::vector<int (*)()> v2;
Run Code Online (Sandbox Code Playgroud)

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

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