在声明变量时使用auto
代替类型,C++编译器就会自动推导出变量的类型
auto sum = 1 + 1;
sum
被推导为int
,使用auto
声明的变量必须要被初始化
联合声明中的类型推导
auto a = 1,b = 2;//正确,a和b都被推导为int
auto c = 3,*pa = &a;//正确,c和pa都有基本数据类型int
auto d = 4,e = 1.2;//错误,联合声明中类型必须相同
联合声明中类型必须相同,Swift笑而不语
auto和复合类型
auto i = 0, &ri = i;
auto a = ri;
给a
初始化的是r
引用的变量值,所以a
被推导为int
auto i = 0, *pi = &i;
auto a = pi;
给a
初始化的是一个指针,所以a
被推导为一个int *
auto和常量
int i = 0;
const int ci = i, &cr = ci;
auto b = ci;//b是int
auto c = cr;//c是int
auto d = &i;//d是int *
auto e = &cr;//e是const int *
因为使用引用就是使用引用的值,所以不会被推导为引用类型。ci
的类型是const int
,由于使用的是ci
的值得类型,所以b,c
会被推导为int
。
因为ci
是const
,所以指向ci
的指针必须是只读指针(const int *)
,所以e被推导为const int *
。
如果需要b
为const int
,则需要显示声明
const auto b = ci;//b是const int
如果想要推导为引用类型,则需要:
auto &g = ci;//g是const int的引用
auto &h = 42;//错误,非常量引用不可以绑定字面值
const auto &j = 42;//正确,常量引用可以绑定字面值,j就是42的另一个名字
由于ci
是const
,所以指针e
和引用g
都会被推导为顶层const
注意:
联合声明中的类型必须一致,const属于基本数据类型的一部分,所以const也需要一致,而*
和&
则从属于声明符,不参与。
auto k = ci, &l = i;//正确,k和l基本类型为int
auto &m = ci,*p = &ci;//正确,m和p都为const int
auto &n = i,*p2 = &ci;//错误,n为int 而 p2 为const int
以后涉及到新标准,就不再研究了