当使用 auto 自动推断类型时,需要注意以下几点:
一、必须要有初始值
一个显而易见的道理,auto 表示编译器根据初始值类型推断声明变量的类型,因此必须要有初始值。
二、一条声明语句只能有一种基本类型
auto i = 0, *p = &i; // 正确,基本类型是int
auto sz = 0, pi = 3.14; // 错误,由sz推断基本类型是int,但pi是double
需要特别注意,第一条语句的 *
是从属于p的,表示p是指针,与基本类型无关,基本类型是int。
三、auto 一般会忽略初始值的顶层const属性
所谓顶层const和底层const,是为了研究指针而引入的说法。顶层const属性是指针自身具有const属性;而底层const属性则是指针特有的,指的是指针指向对象具有的const属性。
一般来说,讨论指针以外的对象时,const属性都是指顶层const。引用类型比较特殊,因为引用本身不是对象,而是另一个对象的别名,因此讨论引用的const属性时一定指的是底层const。
auto i = 0;
const int ci = i, &cr = ci; // cr是ci的别名
auto b = ci; b++; // b是int,ci的顶层const属性被忽略
auto c = cr; c++; // c是int,cr(即ci)的顶层const属性被忽略
auto d = &i; (*d)+