作为比较器的函数类

Арт*_*вый 3 c++ templates

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

set<int, greater<int>> s;
Run Code Online (Sandbox Code Playgroud)

但我也可以

set<int, greater<>> s;
Run Code Online (Sandbox Code Playgroud)

编译器如何理解这一点?

2)为什么在下面的情况下

vector<int> a;
binary_search(a.begin(), a.end(), 5, greater<>());
Run Code Online (Sandbox Code Playgroud)

我必须写Greater<>(),而不是Greater<>。这有什么原因不能在任何地方都做同样的事情?

son*_*yao 6

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

因为,由于C ++ 14,模板参数Tstd::greater具有缺省值void; thenstd::greater<>std::greater<void>.

标准库提供了一种特殊化的std::greaterwhenT未指定,这使得参数类型和返回类型有待推导。

2)这有什么原因不能在所有地方都做同样的事情?

因为binary_search是一个函数并且期望它的参数是对象。greater<>(即greater<void>) 是一个类型,whilegreater<>()是一个对象(它是 上下文中的临时对象binary_search(a.begin(), a.end(), 5, greater<>());)。

顺便说一句:在 中set<int, greater<>> s;,您指定greater<>为模板参数。的第二个模板参数std::set是一个类型模板参数 ,那么指定greater<>(这是一个类型)作为模板参数就可以了。