模板函数没有明确使用类型,奇怪的重载排名

时间:2015-11-20 18:20:55

标签: c++ templates overload-resolution

我无法为我的问题提出更好的标题。基本上它恢复到以下代码:

#include <iostream>

template<typename T> // generic
void f(T)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

template<typename T> 
void f(int)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main()
{   
    f(42);        // calls generic f(T)
    f<int>(42);   // calls f(int)
    f<int>(42.2); // also calls f(int)
}

Live on Coliru

我的问题:

  1. 第二个超载在语法上是否正常?该类型不会在任何地方使用。似乎没问题,因为程序用g ++和clang ++编译。
  2. 编译器如何选择要调用的重载?我理解为什么f(42)会调用泛型f(T),但为什么f<int>(42)f<int>(42.2)会导致调用第二个重载?

1 个答案:

答案 0 :(得分:2)

  1. 是。只是T不能从论证中推断出来。没关系,因为你在(2)和(3)中提供了一个模板参数。

  2. 如果您在调用T时未指定T,它将选择推导的版本(1)(示例1)。如果您在呼叫站点指定T,它将不会尝试推断T,因为您已经告诉它T是什么(示例2和3)。