# 自动类型推导:auto
在C++11中可以使用auto来根据变量的初始值类型自动为变量选择匹配的数据类型。
##举例
int a;
auto x=a;//x为int类型
##auto使用限制
一、auto变量必须在定义时初始化,类似于const关键字
auto a1=10 //正确
auto b1;//错误
b1=10;
二、一行同一类
auto a4=10,a5 = 20; //正确
auto b4 = 20,b5=20.0; //错误,没有推导为同一类型
三、如果auto后没有&符号则推导类型去除引用,指针,const等
int a = 10;
int& b=a;
auto x=b;//x为int类型而不是int&类型(去除引用)
const int a1 = 10;
auto bi=a1;//b1的类型为int而非const int(去除const)
四、如果auto后有&符号则推导类型保留引用,指针,const
int a=10;int& b=a;
auto& d=b;//d为int&类型
const int a2=10;
auto& b2=a2;//b2为const int类型
五、初始化表达式为数组时,auto关键字推导类型为指针
int arr[10] = {0};
auto auto_arr = arr; //编译正确
auto auto_arr3[10] = arr; //编译错误
原因:auto推导类型为指针,因为数组名本身是一个指针类型的变量
六、auto不能直接声明一个数组变量
auto a[3] = {1,2,3} //编译错误
注:auto右值如果是初始化列表形式,那么auto推断的类型为自动数组根据列表中的数组元素个数确定大小
六、若表达式为数组且auto带上&,则推到类型为数组类型
关于数组名退化为指针变量:当数组作为参数传递给函数的时候数组名退化为指针
七、C++14中国auto可以作为函数的返回值和参数类型
##拓展:数组名作为函数的参数:
1.如果形参为数组类型则实参必须是数组名;如果实参是数组名,形参可以是同样维数的数组或者是指针
2.实参数组和形参数组必须类型相同,形参数组可以不指明长度
3.数组名除了作为变量的标识符之外,数组名还代表了该数组在内存中的起始地址,因此当数组名作为函数参数时,实参和形参之间不是“值传递”,而是"地址传递",实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。