- 指针与引用的初始化
int i = 1;
const j = 2;
//错误,&不可以作用在literal value上
int *ptr = &2;
const int *ptr = &2;
int *ptr = &i//正确
int *ptr = &j//错误,底层const之间的转换问题
int "e = 2//错误,int引用不能绑定在literal value上
const int "e = 2//正确
- 顶层和底层const赋值
顶层赋值忽略const(也就是可以为顶层const初始化一个非const值,也可以为一个非const值初始化一个顶层const值,并且被初始化的对象类型不改变)
int test = 2;
int *ptr_non_ct = nullptr;
int *const ptr_ct = ptr_non_ct;//正确,并且ptr仍然是一个int*
ptr = &test//错,因为ptr还保持着int* const的顶层const性质
//////////////////////////////////////////////
int *const ptr_ct = nullptr;
int *ptr_non_ct = ptr;
ptr_non_ct = &i;//正确
//(int*)向(const int)*const 类型转换,既有底层const也有顶层const,且还保持了顶层const的性质
const int *const PTR_ct = ptr_non_ct;
////////////////////////////////////////////
int *const ptr_ct = PTR_ct;//错误,底层const不能由const向非const转换
- PS:
同样的我们可以解释接受顶层const参数和非const参数的两个重载函数是不正确的
int test (int *);
int test (int *const)
因为不管传的是int实参还是int const实参都是可以的,编译器无法进行匹配,所以本质上是一样的
int TEST (int *);
int TEST (const int*);
这两个底层const本质就不一样了,因为const int* 无法传给int*