C++模板实参类型推导

1. 什么是模板

C++特性之一,批量生成代码的手段。

2. 模板有什么应用?

1. 泛型编程

例如:std::vector

2. 模板元编程

利用模板的特化等特性,在编译期计算出结果。
例如: C++模板实参类型推导_第1张图片

3.模板实参类型推导

虽然模板这么牛逼,但是今天我们不讲上述两个特性,我们讲一下细节:给模板填入一个类型时,模板是如何推导出实参(T)的类型。

1.实参确定的几种方式

编译期间,编译器一定会确定每个模板实参T的类型,一般开发者指定类型有以下几种方式。

  1. 显式指定,如图 fun(15); 直接指定T的类型为int,不过我们一般不这么做。
  2. 隐式指定,通过给类型为T的参数传实参,来确定T的类型,如图: fun(15); 因为15会被编译期认为是int,所以T也为int类型。
  3. 隐式指定,通过被赋值的左值来确定。如图。
    C++模板实参类型推导_第2张图片
    这篇博客要说的就是后两种隐式指定确定T的类型,可能有人觉得,不就是直接把类型替换吗,有啥好说的?请继续往下看!

2. 问题

已知模板函数以及变量如下:
C++模板实参类型推导_第3张图片
请判断一下模板函数实例的类型:
C++模板实参类型推导_第4张图片

3.推导方法

分三种情况:

  1. 如果模板形参是引用或者是指针类型,但不是万能引用
    如果函数实参是引用类型,那么则丢弃实参的引用。然后用函数实参类型去匹配模板实参。 C++模板实参类型推导_第5张图片

  2. 模板形参是万能引用类型
    如果函数实参是“左值”,则将模板形参推导为函数实参的左值引用类型,最后根据引用折叠规则推导函数形参类型。
    如果函数实参是“右值”,则模板形参将去掉引用,然后和模板形参组合成最终函数形参类型。
    C++模板实参类型推导_第6张图片

  3. 模板形参既不是指针也不是引用
    模板实参将忽略函数实参的引用类型和cv限定符。对于数组类型和函数类型要退化为指针类型。
    C++模板实参类型推导_第7张图片

4.最终答案

C++模板实参类型推导_第8张图片
C++模板实参类型推导_第9张图片

4. 最后

顺嘴说一下,auto关键字推导类型也符合上述规则,除了…
在这里插入图片描述
这时x会被推导为 std::initializer_list,模板会报错。

你可能感兴趣的:(#,C++,c++,编程语言)