C++学习笔记(4)----模板实参推断

1. 如图所示代码,模板函数 compare(const T&, const T&) 要求两个参数类型要一样。

  compare("bye","dad") 调用,将模板参数推断为 const char[4] (因为还有一个 NULL 字符串结尾),而且两个参数都为 const char[4],所以可以正常实例化模板函数。

  而 compare("hi","world") 调用,将两个模板参数本别推断为 const char [3] 和 const char [6],两个参数类型不同,所以无法实例化该模板参数。

  

 

2.  如图所示:

  calc(ch,'c')实例化了 char calc(char,int)函数,因为 'c' 的类型为 char ,可以转换为 int。

  同样,因为 float 类型可以转换为 int 类型,所以 calc(d,f) 调用可以正常实例化 double calc(double,int) 函数。

  又因为 ch 和 'c' 都是 char 类型,所以 fcn(ch,'c') 可以实例化 char fcn(char,char) 函数。

  而 d 和 f 分别是 double 和 float 类型,所以无法实例化要求两个参数类型相同的 fcn(T,T) 函数。

 

3. 指定显示模板参数

 

4. 当一个函数参数是模板类型参数的一个普通(左值)引用时(即,形如 T&),绑定规则告诉我们,只能传递给它一个左值(如,一个变量或一个返回引用类型的表达式)。实参可以使const 类型,也可以不是。如果实参是const 的,则 T 将被推断为 const 类型:

 

5. 如果一个模板函数参数的类型是 const T &,正常的绑定规则告诉我们可以传递给它任何类型的实参-----一个对象(const 或非 const)、一个临时对象或是一个字面常量值。当函数参数本身是 const 时,T 的类型推断的结果不会是一个 const 类型。const 已经是函数参数类型的一部分;因此,它不会也是模板参数类型的一部分:

 

6. 接受右值引用参数的模板函数

void g(T&& val):

void g(T val):

 

void g(const T& val):

posted on 2016-08-03 19:18  HorseShoe2016  阅读(1112)  评论(0编辑  收藏  举报