为什么不询问priorty_queue实例化中比较器的模板参数?

时间:2016-04-07 13:40:00

标签: c++ c++14

我有以下代码来理解优先级队列对象实例化。

#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的任何定义。

有人可以指出我在理解中缺少什么吗?

1 个答案:

答案 0 :(得分:3)

std::greater有一个默认模板参数,因为c++14void

template< class T = void >
struct greater;

但是如果这只是一个默认的模板参数,它会失败,因为你无法用两个int来调用它。发生的事情是std::greater std::greater为空,“留下参数类型和返回类型以推断”(来自specialization):< / p>

  

标准库在未指定T时提供c++14的特化,从而保留参数类型和返回类型。

     实现x&gt;的

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}}