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

Template function without explicit usage of type, strange overload ranking

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

#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. 是的。只是不能从论证中推导出T。没关系,因为您已经在 (2) 和 (3) 中提供了模板参数。

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