c++ - 没有显式使用类型的模板函数,奇怪的重载排名

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

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

关于c++ - 没有显式使用类型的模板函数,奇怪的重载排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33833490/

相关文章:

c++ - qmake:将uic生成的头文件添加到安装目标

c++ - 使用临时函数包装器完美转发

c++ - 如何使用两个模板模板参数指定共享模板变量?

c++ - 如何为 C++ 重载解析和 SFINAE 编写正/负测试?

c++ - 函数重载变得模棱两可

c# - 名称相似的T类型和非T类型方法的执行顺序?

c++ - Opencv 平均滤波器给出与 Matlab 平均滤波器不同的输出

python - 使用ctypes将字符串从python传递到c++-仅发送第一个字符

c++ - 将 Weak ISR Handler 从 Assembly 覆盖到 C++ 不会编译任何代码

c++ - "separately compiled C++ templates"是什么?