• auto让编译器通过初始值推算变量的类型。显然,auto定义的变量必须有初始值。
  • 使用auto也能够在一条语句中声明多个变量。需注意,一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型必须一样。
1
2
auto i = 0, *p = &i;	// 正确,i是整数,p是整型指针
auto sz = 0, pi = 3.14; // 错误,sz和pi类型不一致
  • 编译器以引用对象的类型作为auto的类型。
1
2
int i = 0, &r = i;
auto a = r; // a是一个整数(r是i的别名,而i是一个整数)
  • auto一般会忽略掉顶层const,同时底层const会保留下来,比如当初始值是一个指向常量的指针时。
1
2
3
4
5
const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; // e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
  • 如果希望推断出的auto类型是一个顶层const,需明确指出。
1
const auto f = ci;	// ci的推演类型是int,f是const int
  • 可以将引用类型设置为auto,此时原来的初始化规则仍适用
1
2
3
auto &g = ci;	// g是一个整型常量引用,绑定到ci
auto &h = 42; // 错误,不能为非常量引用绑定字面值
const auto &j = 42; // 正确,可以为常量引用绑定字面值
  • 切记,符号&和*只从属于某个声明符,而非基本数据类型(int等)的一部分。

摘自 C++ Primer