如果初始化表达式是引用,则去除引用语义。
int a = 10; int &b = a; auto c = b;//c的类型为int而非int&(去除引用) auto &d = b;//此时c的类型才为int& c = 100;//a =10; d = 100;//a =100;
如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。
const int a1 = 10; auto b1= a1; //b1的类型为int而非const int(去除const) const auto c1 = a1;//此时c1的类型为const int b1 = 100;//合法 c1 = 100;//非法
如果auto关键字带上&号,则不去除const语意。
const int a2 = 10; auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int b2 = 10; //非法 这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。
初始化表达式为数组时,auto关键字推导类型为指针。
int a3[3] = { 1, 2, 3 }; auto b3 = a3; cout << typeid(b3).name() << endl;程序将输出
int *
若表达式为数组且auto带上&,则推导类型为数组类型。
int a7[3] = { 1, 2, 3 }; auto & b7 = a7; cout << typeid(b7).name() << endl;程序输出
int [3]
函数或者模板参数不能被声明为auto
void func(auto a) //错误 { //... }
时刻要注意auto并不是一个真正的类型。
auto仅仅是一个占位符,它���不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。