C++11新标准之auto类型说明符

auto类型说明符

在开发时常常需要把表达式的值赋给变量, 这就要求在声明变量时清楚地知道表达式的类型.

例: 当两个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 和 引用

总所周知, 使用引用其实就是使用引用的对象. 当使用引用变量初始化auto变量时, 真正参与初始化的其实是引用对象的值.

int nNum = 0, &tmp = nNum;		//nNum类型为int, 初始值为0, 而tmp是nNum的引用, 类型为int&
auto aNum2 = tmp;			//aNum2是一个int, 而不是int&

auto 和 const

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

你可能感兴趣的