最近看C++Primer,里面的顶层const和底层const有点让人搞混,现在总结出以下几点,问题就好解决了:
一、关于顶层const
执行拷贝操作时,顶层const不会有太大影响,但有两个例外:
①非常量引用不能绑定常量。
②非常量指针不能指向常量。
const int ival = 0;
int &ri = ival;//错误,非常量引用不能绑定常量。
int *iptr = &ival;//错误,非常量指针不能指向常量。
所以虽说ival是顶层const,但是上面那两个操作是非法的。
二、关于底层const
底层const在执行拷贝操作时的限制比较大,总结出两点:
①、当拷贝操作的右侧对象具有底层const是要求左侧对象也要有底层const资格(注意是右侧对象具有底层const的时候而不是左侧):
const int val = 0;//顶层const
const int &r= val; //左侧对象为底层const
想上面左侧对象为底层const,而右侧对象为顶层const,不要求为底层const,而且常量引用本身就可以绑定到常量对象上。
回看上面那段代码:
const int ival = 0;
int *iptr = &ival;//错误,非常量指针不能指向常量。
ival是一个顶层const,const int 加取地址符&后变成const int *,变成了底层const,第二个语句右侧对象为底层const,而iptr为普通指针,不具有底层const的资格,所以拷贝是非法的,也可以这样解释。
②、非常量对象一般可以转换成常量,而反过来常量则不能转换成非常量。
int i = 0;
const int &ri = i;
第二句中右侧对象i是非常量,而ri是常量,非常量一般能转换成常量,所以拷贝是合法的。
注意上面的转换,是右侧对象的转换,而不是左侧对象向右侧对象的转换。
弄清以上这几点,顶层const和底层const的问题也就好理解了。