在开发时常常需要把表达式的值赋给变量, 这就要求在声明变量时清楚地知道表达式的类型.
例: 当两个float变量相加时, 一般我们都是用float变量去保存结果值, 但当相加结果超出float允许的精度时, 再用float变量保存可能会丢失精度, 而对此我们一般也不会详细地去计算是否超出精度, 这时就可以使用auto类型说明符去保存结果值, 编译器会根据用auto声明的变量的初始值(这里就是相加结果值)来自动推断变量的类型.
因为编译器会根据auto 变量的初始化来推断类型, 因此用auto声明的变量必须有初始值.
//内置类型
float fNum1 = 123.456;
float fNum2 = 123.123;
auto aNum = fNum1 + fNum2; //aNum初始化为fNum1 和 fNum2相加的结果
使用auto也能在一条语句中声明多个变量.
需要注意的是一条声明语句只能有一个基本数据类型, 所以该语句中所有变量的初始基本数据类型都必须一样:
auto aVar = 0, *p = &aVar; //正确: i是整数, p是整型指针
auto aVar2 = 0, pVar = 3.14; //错误: Var2 和 pVar的初始值的类型不一致
编译器推断出来的auto类型有时候和初始值的类型并不完全一样, 编译器会适当地改变结果类型使其更符合初始化规则.
总所周知, 使用引用其实就是使用引用的对象. 当使用引用变量初始化auto变量时, 真正参与初始化的其实是引用对象的值.
int nNum = 0, &tmp = nNum; //nNum类型为int, 初始值为0, 而tmp是nNum的引用, 类型为int&
auto aNum2 = tmp; //aNum2是一个int, 而不是int&
auto 会忽略顶层const, 但会保留底层const.
顶层const: 表示指针和引用等复合类型变量是常量
底层const: 表示指针和引用等复合类型变量所指对象是常量
int nNum = 0;
int* const p1 = &nNum; //不能改变p1(指针变量)的值, 这是一个顶层const
const int nNum2 = 43; //不能改变nNum2的值, 这是一个底层const
const int nNum = 0; //底层const
auto aVar = nNum; //aVar的类型是const int, 保留底层const
int* const p = &nNum; //顶层const
auto aVar2 = p; //aVar2的类型是int*, 忽略顶层const
如果希望推断出的auto类型是一个顶层const, 需要明确的指出:
int nNum = 0;
const int nNum2 = nNum;
const auto aVar = nNum2; //nNum2的推演类型是int, 若auto前没有const会忽略顶层const, 但这里aVar的类型是const int