1.使用引用其实就是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实就是引用对象的值。
2.auto一般会忽略掉顶层const,同时底层const则会保留下来。
const int ci=i,&cr=ci;
auto b=ci;//ci的顶层const被忽略掉了
auto c=cr;//c是一个整数
auto d=&ci;//d是一个指向常量的指针(对常量对象取地址是一种底层const)
如果需要保留下来顶层const,需要明确指出:
const auto e=ci;//保留顶层const
auto &g=ci;//g是一个整型常量引用,绑定到ci
auto &h=42;//错误,不能为非常量引用绑定字面值
const auto &j=42;//正确:可以为常量引用绑定字面值
3.希望从表达式的类型推断出要定义的变量的类型,但是并不想用该表达式的值初始化变量。为了满足这一要求,C++11新标准引入了decltype;
它的作用是返回操作数的数据类型,编译器分析表达式,并得到它的类型,却不计算表达式的值。
decltype(f()) sum =x;//sum的类型就是函数f的返回类型
const int ci=0,&cj=ci;
decltype(ci) x=0;//x的类型是const int
decltype(cj) y=x;//y的类型是const int&,y绑定到变量x
decltype(cj) z;//错误:z是一个引用,必须初始化
有些表达式将向decltype返回一个引用类型,一般来说当这种情况发生时,意味着该表达式的结果对象能作为一条赋值语句的左值:
//decltype的结果可以是引用类型
int i=42,*p=&i,&r=i;
decltype(r+0) b;//正确:加法的结果是int,因此b是一个(未初始化的)int
decltype(*p) c;//错误,c是int&,必须初始化
r是一个引用,可以将r作为i表达式的一部分,如r+0,显然这个表达式的结果将是一个具体值,而非一个引用。
//decltype的表达式如果是加上了括号的变量,结果将是引用
decltype((i)) d;//错误:d是int&,必须初始化
decltype(i) e;//正确,e是一个未初始化的int变量