1,定义
模板实参推断:编译器用来确定实例化哪个函数模板的过程。编译器检查用模板形参指定的实参的类型,它用绑定到模板形参的类型或值自动实例化函数的一个版本。
简单的说,就是(根据调用函数模板的方式)确认函数模板类型形参的类型。
注意:只有函数模板才有模板实参推断,类模板的形参该实例化为什么类型是写死的,用不着“推断”。
2,类型转换原则
一般而言,不会转化实参以匹配已有的实例化,相反,会产生新的实例化,或产生不了实例化,报错。
只有两个例外:
- const转换:
- 如果模板形参为const引用,则其可以接受const或非const引用
- 如果模板形参为const指针,则其可以接受const或非const指针
- 如果模板形参不是引用或指针(值传递),则形参和实参都忽略const
- 如果模板形参不是引用或指针(值传递),则数组会转化为指针,数组实参将当作指向其第一个元素的指针;
- 如果模板形参不是引用或指针(值传递),则函数会转化为指针,函数实参将当作指向函数类型的指针;
template <typename T> T fobj(T, T);//值传递
template <typename T> T fref(const T&, const T&);//引用
string s1("a value");
const string s2("another value");
fobj(s1,s2);//值传递,const被忽略
fref(s1,s2);//引用,s1也被转成了const引用
int a[10], b[42];
fobj(a, b);//值传递,数组被转成指针,T被推断为int *,f(int*,int*)
fref(a, b);//Error!!,引用,a导致T被推断为int(&T)[5]、b导致T被推断为int(&T)[5],矛盾