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

Template function without explicit usage of type, strange overload ranking

本文关键字:重载 类型 函数      更新时间:2023-10-16

我想不出比这更好的题目了。基本上它恢复到以下代码:

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

在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)。