C++98 auto
早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期:
int a =10 ; //拥有自动生命期
auto int b = 20 ;//拥有自动生命期
static int c = 30 ;//延长了生命期
C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断。
C++11 auto (C++11新特性)
编程的时候常常需要把表达式的值赋给变量,这就要求在声明的时候清楚的知道表达式的类型。然而这并不容易,有的时候甚至根本做不到。为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须有初值(以此来判断当前的类型)。
auto item = val1 + val2;
//item初始化为val1和val2相加的结果
此处的编译器将根据val1和val2相加的结果来判断item的类型。如果val1和val2是自定义类型(class)的对象,则item的类型就是自定义类型(class)。如果val1和val2的类型是double的话,则item的类型就是double。
如是简单的了解的话到这里就OK
注:
- auto 变量必须在定义时初始化,这类似于const关键字。
- 定义在一个auto序列的变量必须始终推导成同一类型
C++
auto a4 = 10, a5 = 20, a6 = 30; //正确
auto b4 = 10, b5 = 20.0, b6 = 'a'; //错误,没有推导为同一类型
auto 处理&(引用时的问题)
编译器推断出来auto的类型和初值的类型并不完全一样。
例如:
int a = 10;
int &b = a; //b为a的引用
auto tmp = b;
cout << typeid(tmp).name() << endl;
//输出int
auto处理const的问题
auto一般会忽略掉顶层const,同时底层的const会保留下来,比如当初值是一个指向常量的指针时:
const int ci = i , &cr = ci;
auto b = ci; //不是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; //c是一个整数(cr是ci的别名,ci本身是一个const)
auto d = &i; //d是一个整型指针(整数的地址就是指向整数的指针)
auto e = &ci; //e是一个指向整数常量的指针(对常量取地址是一种底层的const)
小结:
- 如果auto关键字带上&号,则不去除const语意。
- 初始化表达式为数组时,auto关键字推导类型为指针。
- 若表达式为数组且auto带上&,则推导类型为数组类型
- 函数或者模板参数不能被声明为auto
- 时刻要注意auto并不是一个真正的类型。
auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。