由此我们可以得知非底层const的指针是可以通过隐式转换转变成底层const的。
const与引用
可以把引用绑定在const的变量上,称为const的引用,对常量的引用。
与普通的引用不同的是,对常量的引用不能被用作修改它所绑定的对象
const int ci=5; const int &r=ci; r=6//错误不可以通过常引用来修改值 int &r2=ci//错误,试图让一个非常量引用指向一个常量对象。
const引用的初始化
我们知道对于引用来说初始化时一定要用一个对象初始化,且该对象的类型需要与之匹配。
但是const的引用是个例外,在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可,甚至允许为一个常量引用绑定非常量的对象、字面值或者是表达式。
int i=42; const int &r1=i;//允许将const int&绑定到一个普通int对象上 const int &r2=3.14;//正确:r2是一个常量引用 const int &r3=r1*2;//正确:r3是一个常量引用 int &r4 =r1*2;//错误,非常量引用不能用表达式初始化
C++primer中给出了可以这么做的原因:
要想理解这种例外情况的原因,最简单的方法是弄清楚当一个常量引用被绑定到另外一种类型上都时到底发生了什么:
double dval=3.14; const int &ri=dval;
此处ri引用了一个int型的数。对ri的操作应该是整数运算,但dval却是一个双精度浮点数而非整数。因此为了确保让ri绑定一个整数,编译器把上述代码变成了如下形式:
const int temp=dval;//由双精度浮点数生成一个临时的整型常量 const int &ri=temp;//让ri绑定这个临时量
在这种情况下,ri绑定了一个临时量对象。所谓临时量对象就是当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象。C++程序员们常常把临时量对象简称为临时量。
const与auto类型说明符
auto类型说明符是C++11中新引入的类型说明符,可以自动推断类型。
编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当的改变结果类型使其更符合初始化规则。
auto在推断带有const的对象时,编译器一般会忽略掉顶层const,同时底层const则会保留下来。 另外对于引用由于引用没有真正的实体,所以如果用一个引用来初始化auto类型时,auto实际上为引用所指向的对象的类型,而非引用,如果要说明其为引用类型,需要使用auto&。
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)










