编程的时候常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型。然而做到这一点很难,有时候根本做不到。为了解决这个问题。C++11新标准引入了auto类型说明符,用它就 能让编译器帮我们去分析表达式所属的类型。auto通过编译器的类型来推算变量的类型。因此,auto定义的变量必须有初始值。
使用auto的作用是很大的,它能让我们的代码更加流畅简易。
尽管auto的定义看起来简单明了,但是有时编译器推断出来的auto类型有时候和初始值类型并不一样,所以编译器会适当的改变结果类型使其更符合初始规则。所以有几个细节需要我们注意:
1 使用引用类型给auto类型的初始值的时候,真正参与初始化的是引用对象的值。
如int i = 0, &r = i;
auto a = r; //a是一个整数(r是i的别名,而i是一个整数)
2 auto一般会忽略顶层的const(顶层const表示指针本身是个常量,而顶层cosnt表示指针所指的对象是常量。也就是说顶层cosnt的这个概念作用于变量本身,所以const int i 也是一个顶层const;当执行对象拷贝的时候,不能让一个非指向常量的指针拷贝一个指向常量的指针,为了数据的安全,所以会检查底层const)
比如 :
const int ci = i, &cr = ci;
auto b = ci; //b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; //c也是一个整数(cr是ci 的别名,次本身是一个顶层const)
auto d = &i; //d是一个整型指针。
auto e = &ci; //e是一个指向整数常量的指针。(对常量对象取地址是一种低层的)
如果我们希望推断出auto类型是一个顶层的const,则需要明确的指出,
const auto f = ci;