模板函数没有明确使用类型,奇怪的重载排名
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)
}
在Coliru上直播
我的问题:
- 第二个重载在语法上可以吗?该类型在其中的任何地方都没有使用。它似乎还可以,因为该程序使用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++模板类型使运算符重载?
- 模板化类如何解析在其类型之一上调用的重载非成员函数?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 泛型枚举和其他类型的重载模板函数
- 避免在人为的重载函数调用中拼写出类型
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 重载模板函数未为特定类型选择正确的版本
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 具有重载类型转换运算符的函数对象崩溃
- 为什么在指定重载类型的返回值时出现编译错误
- 忽略C++重载类型转换运算符
- 重载 C++ 类型以处理自定义类
- 重载类型强制转换运算符,以强制转换为指向函数的指针
- C++中的一元运算符重载类型(新手)
- 函数不能在模板实例中推导出重载类型
- 重载类型转换运算符的语法
- 重载 C++ 类型转换(函数)