顶层const表示任意对象/数据类型本身为常量
底层const与指针和引用等复合类型的基本类型有关
注:
(1)用于声明引用的const都是底层const
(2)指针类型既可以是顶层const也可以是底层const
eg:
int i = 0;
int *const p1 = &i; //p1为顶层const,其值不能改变
const int ci = 42; //ci为顶层const,其值不能改变
const int *p2 = &ci; //允许改变p2的值,这是一个底层const
const int *const p3 = p2; //靠右的为顶层const,靠左的为底层const
const int &r = ci; //用于声明引用的都为底层const
注:底层const的限制:
当执行拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者,两个对象的数据类型必须能够转换。一般来说非常量可以转换为常量,反之则不行。
具体操作实例:
eg:
i = ci; //正确,ci顶层const不受影响
p2 = p3;//正确,p2和p3指向的对象都相同,且p3又是一个顶层const其本身也为常量
int *p = p3; //错误,p3包含底层const定义但是p没有
p2 = &i;//正确,int i 可以转换为常量
int &ri = ci;//错误,普通的int &不能绑定到int常量上
const int &r2 = i;//正确,const int& 可以绑定到一个普通的int上
补充:
vector<int>::iterator /*可以理解为*/ int* //代表非常量
vector<int>::const_iterator /*可以理解为*/ const int* //代表底层const
const vector<int>::iterator /*可以理解为*/ int* const //代表顶层const
const vector<int>::iterator /*可以理解为*/ const int* const //左侧的const为底层const,右侧的顶层const