我有以下代码来理解优先级队列对象实例化。
#include <queue>
#include <functional>
int main(int argc, char *argv[])
{
std::priority_queue<int, std::vector<int>, std::greater<>> int_min_heap;
return 0;
}
priority_queue模板的第三个参数是比较器功能。可以看出我使用了'std :: greater'。
这是成功编译的,虽然我期望这会导致编译失败,因为我没有给std :: more提供参数,即模板实例化的正确方法(按照我)
std::priority_queue<int, std::vector<int>, std::greater<int>> int_min_heap;
我可以在没有输入参数的情况下找到std :: greater的任何定义。
有人可以指出我在理解中缺少什么吗?
答案 0 :(得分:3)
std::greater
有一个默认模板参数,因为c++14
是void
:
template< class T = void >
struct greater;
但是如果这只是一个默认的模板参数,它会失败,因为你无法用两个int
来调用它。发生的事情是std::greater
std::greater
为空,“留下参数类型和返回类型以推断”(来自specialization):< / p>
标准库在未指定
实现x&gt;的T
时提供c++14
的特化,从而保留参数类型和返回类型。encppreference.com函数对象y推导出参数和返回类型 (课程模板专业化)
请注意,如果没有// error: wrong number of template arguments (0, should be 1)
std::priority_queue<int, std::vector<int> std::greater<>>
// error: forming reference to void
std::priority_queue<int, std::vector<int>, std::greater<void>>
这两个都无法编译:
{{1}}