用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如 double)不同,auto 让编译器通过初始值来推算变量的类型。工地围挡显然,auto定义的变量必须有初始值:
auto i = 3 + 2; //从右推左, auto填充为int
auto m = 9。0, *p = &m; // auto填充为double
auto a = 3, b = 2.0; // 不可以,只能填充一个值
vector<int> v{1, 2, 3, 4};
auto it = v.begin(); // 类型为vector<int>::iterator,避免冗长的声明
auto是从右边类型推工地围挡左边类型,并不是变量声明时的类型。
int i = 0, &r = i;
auto a = r; //a是int,不是int&
auto &b = r; //引用需显式指将参数声明为`auto`,作用与模板完全相同(但更简洁),会根据类型生成多个函数。而返回值设为 `auto`,就可以根据return语句的类型自动生成返回类型。不过auto只是代表“自动推断一种类型”。C++的函数返回值只能有一种类型。如果多处return类型不一致,推断失败就会报错。http://www.zgysffm.com/
## decltype
int ir[10];
auto x = ir; // 数组名被转化为指针,值int*
上面的代码可以正常运行,但是换成注释语句后就不行了,原因在前面的示例代码里已经提过了。`auto &row: a`里,row的类型是`int[3]`,是可迭代的。但`auto row: a`里,它的类型成为了`int*`,不可迭代,自然第二个for执行不了。数组到指针是一种退化,因为只有头地址而丢失了长度。http://www.zgysffm.com/
auto &x = ir; // 数组名还是数组,值为int[10]