C++ 作为比较器的函数类

C++ 作为比较器的函数类,c++,templates,C++,Templates,1) 如果我想让集合按降序存储元素,我可以写: set<int, greater<int>> s; set; 但我也可以 set<int, greater<>> s; set; 编译器如何理解这一点 2) 为什么会出现以下情况 vector<int> a; binary_search(a.begin(), a.end(), 5, greater<>()); 向量a; 二进制搜索(a.begin(),a.end(),

1) 如果我想让集合按降序存储元素,我可以写:

set<int, greater<int>> s;
set;
但我也可以

set<int, greater<>> s;
set;
编译器如何理解这一点

2) 为什么会出现以下情况

vector<int> a;
binary_search(a.begin(), a.end(), 5, greater<>());
向量a;
二进制搜索(a.begin(),a.end(),5,greater());
我必须写greater(),而不是greater。这就是为什么不能在所有地方都这样做的原因

1) 编译器如何理解这一点

因为从C++14开始,的模板参数
T
有一个默认值
void
;那么
std::greater
std::greater
一样

当未指定
T
时,标准库提供了
std::greater
的专门化,这使得参数类型和返回类型有待推导

2) 这就是为什么不能在所有地方都这样做的原因

因为
binary\u search
是一个函数,并且期望其参数作为对象
greater
(即
greater
)是类型,而
greater()
对象(它是
二进制搜索(a.begin(),a.end(),5,greater();
)上下文中的临时对象)

顺便说一句:在
中设置s
,您正在指定
更大的
作为模板参数。的第二个模板参数是a,那么可以指定
更大的
(它是类型)作为模板参数