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、指明调用参数可能有不同的类型(多个模板参数)。

posted @   补码  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示