auto类型说明符:当编程时不清楚此变量的类型时,就可以使用auto说明符让编译器去根据初始值来判断此变量的类型。
要点:
1.当使用了auto说明符时语句中所有变量的初始基本数据必须一样。
auto a=0,*p=0;
auto a=0,p=3.15 // err,a与p的类型不一样
2.当auto说明符,中用的是引用进行初始化时,实际上初始化的数据类型是引用的对象。
int i=10,&r=i;
auto a=r; // auto a=i;
3.auto一般会忽略顶层const,同时底层const则会保留下来,特殊情况是:当auto修饰的变量的初始值是一个既有顶层也有底层的变量时,就不会进行忽略顶层const而保留底层const的操作。
int i=0;
const int ci=i,&cr=ci;
auto b=ci; // 这里b是一个整数,顶层const被忽略掉了
auto d=&i; // 这里d是一个指向int型的指针。
auto e=&ci; // 这里e是一个指向int型的常量指针,底层const被保留了下来
int a=10;
const int *const i = &a;
auto k = &i; // 这里的k就是一个指向常量的常量指针,即const int *const k =&i;
解释:对常量对象取地址是一种底层const,为什么是一种底层const呢?因为:ci是一个int型常量,那么ci的值和地址就不能变,既然不能变,那么&ci也就不能变,即e所指的对象不能变,而要有这个特性,那么e的类型就只能是const int *const e,但是auto会忽略掉顶层的const,所以就只能是const int *e;,如果要要求变成即指向常量的常量指针,则只需要在auto前面加上const即可,如下。
4.如果需要推断出的auto是一个顶层const,则需要明确指出:
const auto f=&ci; // 这样总的类型就会变成 const int *const f=&ci;
const auto f=ci; // 等价于 const int f=ci;
5.函数的参数不能是auto类型。
int A(auto i) // err
{
}