第一章 使用C++11让程序更简洁、更现代
1.1 类型推导
C++11引入了auto
和decltype
关键字实现类型推导。
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也经常用在通过变量表达式抽取变量类型上。