1.auto关键字
用于自动推断类型,根据等号右边变量的类型或字面值
e.g.1:
int i1 = 1;double d1 = 2.1;
auto i2 = i1;//i2是int型
auto i3 = 5;//i3是int型
auto d2 = d1;//d2是double型
e.g.2:
一句auto可以声明并初始化多个变量,但是等号右边变量必须是同一基本类型
int i1 = 1, i2 = 2;
double d = 1.1;
auto a = i1, b = i2;//合法,二者等号右边类型一致且均为int
auto a = i1, b = d;//不合法,i1和d的类型不相同
auto a = i1, i2 = 2, *p = &i2;//合法,i1、i2为整数,p为整形指针
完全当做int、double等基本类型的等价写法,推断出来的不包括*、&,并保留底层const忽略顶层const。
注意:auto *p = &a 等价 auto p = &a,因为&a得到的是a的地址,地址的类型就是指针。
2.decltype关键字
与auto类似,也用于推断类型,但用法不同
e.g.1:
可以推断函数的返回值作为类型,但是并不会调用函数
int f()
{
//.......
}
int i = 1;
decltype(f()) a = i;//f()的返回值为int,所以a是int型
e.g.2:
与auto不同的是,decltype推断出的包括*、&、const
const int ic = 0, jc = 2, &ir = ic;
decltype(ic) ic2 = 1;//ic2是 const int
decltype(ir) ir2 = jc;//jc是const int &
decltype(ir) ir3;//错误,引用必须初始化
e.g.3:
在对引用、指针有关进行推断时候,返回的可能不是引用
int i = 0, &ir = i, *p = i;
decltype(ir + 0) a = i;//因为ir + 0 返回的是一个int值,所以a是int型
decltype(*p) b;//不合法,如果decltype(p) b则b是一个指针,而此处为decltype(*p) b,对指针p的提领的结果进行推断,指针p的提领结果为引用,所以b为引用
e.g.4:
如果给要推断的内容加上括号,则成为一个表达式,变量是可作为赋值语句左值的特殊表达式,加上括号后推断得到引用类型
int i = 0;
decltype(i) a;//正确,a为int型
decltype((i)) b;//错误,b为int&,必须初始化