C++11新标准引入了auto类型说明符
用它能让编译器替我们分析表达式所属的类型 auto让编译器通过初始值来推算出标量的类型。
显然auto定义的变量必须有初始值
auto item = vall + val2; //item的类型通过val2和val1的相加的结果得出
使用auto也能在一条语句中声明多个变量 因为一条声明语句只能有一个基本数据类型 所以改语句中所有的变量的初始数据类型都必须是一样的才可以
复合型 常量和auto
编译器推断出来的auto类型有时候和初始值的类型并不一样 编译器会适当的地改变类型使其更符合初始化的规则
(1)首先 使用引用其实是使用的引用的对象,特别是当引用被当做初始值时,真正参与初始化的其实是引用对象的值。
此时编译器以引用对象的类型来作为auto的类型:
int i = 0,&r = i;
auto a = r; // a是一个整数的类型(r是i的别名,而i是一个整数类型
(2)其次 auto一般会忽视掉顶层的const,同时顶层的const側会保留下来,比如当初始值是一个指向常量的指针的时候
const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了)
auto c = cr; //c是一个整数(cr是ci的别名,ci本身是一个顶层const)
auto d = &i; // d是一个整数指针(整数的地址就是指向整数的指针)
auto e = &ci;// e是一个指向整数常量的指针(对常量对象取地址是一种底层const)
如果希望推断出来的auto类型是一个顶层的const,需要明确的指出
const auto f = ci; //ci的推算类型是int,f 是const int;
(3)可以将引用设为auto,此时原来的初始化规则任然实用
auto & g = ci; // g是一个整数常量引用 绑定到ci
auto & h = 42; //错误: 不能为非常量引用绑定字面量
const auto & j = 42; //正确 可以为常量引用绑定字面量
设置一个类型为auto的引用时 初始值中的顶层常量属性仍然保留。
要在一条语句中定义读个变量 切记 符号&和* 只从属某个声明符号 而非基本数据类型的一部分 因此初始值必须是同一种类型
auto k = ci, &l = i; //k是整数,l是整数的引用
auto &m = ci, *p = &ci; //m是对整形常量的引用 p是指向整形常量的指针
auto &n = i,*p = &ci;
// n是整数类型 p是指向常量整数的指针 数据类型不一样 一个是int 一个是const int 所以错误