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