《深入应用C++11——代码优化与工程级应用》

第一章 使用C++11让程序更简洁、更现代

1.1 类型推导

C++11引入了autodecltype关键字实现类型推导。

1.1.1 auto类型推导

1、auto关键词的新意义
auto 可用于隐式类型定义。

不同于Python等动态类型语言(运行时才确定数据类型),隐式类型定义的类型推导发生在编译器。(C++是静态类型语言)

使用auto声明的变量必须立刻初始化,以让编译器推断出它的实际类型,并在 编译 时将auto占位符替换为真正的类型。

2、auto的推导规则

  • 当不声明为指针或引用时,auto的推导结果会将初始化表达式的引用和cv限定符抛弃
  • 当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性。

3、auto的限制

  • auto不能用于函数参数
  • auto不能用于非静态成员变量
  • auto无法定义数组
  • auto无法推导出模板参数

4、什么时候用auto

  • 当类型的名称很长时,可以用auto简化代码
  • 当不确定变量应用被定义成什么类型时,如泛型函数的参数类型。

注意: auto虽然好用,但是不应该过度使用,否则,会严重降低代码的可读性和可维护性。

1.1.2 decltype

1、获知表达式的类型

decltype关键字用于在编译时推导出一个表达式的类型,其语法格式为decltype(exp),该关键字并不会真正计算表达式的值。

2、decltype的推导规则

  • 当exp是标识符、类访问表达式时,decltype(exp)和exp的类型一致
  • 当exp是函数调用时,decltype(exp)和返回值的类型一致
  • 其他情况,若exp是一个左值,则decltype(exp)是exp类型的左值 引用 ,否则和exp类型一致。

3、decltype的实际应用

decltype的应用多出现在泛型编程中。

decltype也经常用在通过变量表达式抽取变量类型上。

1.1.3 返回类型后置语法——auto和decltype的结合使用