Function Template 类型推断中的类型转换
在类型推断的时候自动的类型转换是受限制的:
- 如果调用参数是按引用传递的,任何类型转换都不被允许。通过模板类型参数 T 定义的 两个参数,它们实参的类型必须完全一样。
- 如果调用参数是按值传递的,那么只有退化(decay)这一类简单转换是被允许的:const 和 volatile 限制符会被忽略,引用被转换成被引用的类型,raw array 和函数被转换为相 应的指针类型。通过模板类型参数 T 定义的两个参数,它们实参的类型在退化(decay) 后必须一样。
例如:
1 template<typename T> 2 T max (T a, T b); … 3 int const c = 42; 4 int i = 1; 5 max(i, c); // OK: T 被推断为 int,c 中的 const 被 decay 掉 6 max(c, c); // OK: T 被推断为 int 7 int& ir = i; 8 max(i, ir); // OK: T 被推断为 int, ir 中的引用被 decay 掉 9 int arr[4]; 10 max(&i, arr); // OK: T 被推断为 int* 。
11 // 但是像下面这样是错误的: 12 max(4, 7.2); // ERROR: 不确定 T 该被推断为 int 还是 double 13 std::string s; 14 max("hello", s); //ERROR: 不确定 T 该被推断为 const[6] 还是 std::string
有两种办法解决以上错误:
1、对参数做类型转换
max(static_cast<double>(4), 7.2); // OK
2、显示指出类型参数T的类型,这样编译器就不会再去做类型推导
max<double>(4, 7.2); // OK
3、指明调用参数可能有不同的类型(多个模板参数)。
分类:
C++template
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!