C++ 作为比较器的函数类
1) 如果我想让集合按降序存储元素,我可以写: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(),
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,那么可以指定更大的
(它是类型)作为模板参数