我无法为我的问题想出更好的标题。基本上它恢复到以下代码:
#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)
}
我的问题:
- 第二个重载在语法上正确吗?该类型未在其中的任何地方使用。看起来没问题,因为程序同时使用 g++ 和 clang++ 进行编译。
- 编译器如何选择调用哪个重载?我明白为什么
f(42)
调用通用f(T)
,但是为什么f<int>(42)
和f<int>(42.2)
导致第二次重载被调用?
最佳答案
是的。只是 T 无法从论证中推导出来。没关系,因为您已在 (2) 和 (3) 中提供了模板参数。
如果调用时不指定T(示例1),它将选择推导版本(1)。如果您在调用站点指定 T,它不会尝试推断 T,因为您已经告诉它 T 是什么(示例 2 和 3)。
关于c++ - 没有显式使用类型的模板函数,奇怪的重载排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33833490/