Function Template 类型推断中的类型转换
在类型推断的时候自动的类型转换是受限制的:
- 如果调用参数是按引用传递的,任何类型转换都不被允许。通过模板类型参数 T 定义的 两个参数,它们实参的类型必须完全一样。
- 如果调用参数是按值传递的,那么只有退化(decay)这一类简单转换是被允许的:const 和 volatile 限制符会被忽略,引用被转换成被引用的类型,raw array 和函数被转换为相 应的指针类型。通过模板类型参数 T 定义的两个参数,它们实参的类型在退化(decay) 后必须一样。
例如:
1 template2 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
2、显示指出类型参数T的类型,这样编译器就不会再去做类型推导
max
3、指明调用参数可能有不同的类型(多个模板参数)。