int a;
const int *pr=a; 底层const 指针对指向的变量是否为const并不关心
const int ci;
const &ri= ci;
或者
int ci;
const int &ri=ci; 都是可以的,const &引用不关心是否引用的为const 变量。
但变量为const,对const变量的引用或者指针必须为const
常量引用是 对const的引用,
const int &a=12;
const int &a=12.2;
都是可以的,只要初始化常量引用时的表达式结果能转换成引用的类型即可。
double d=12.2;
const int &a=d;
相当于先把d赋值给一个const int 的临时量,再让a作为临时量的引用.
所以当引用不是const时,是不合法的 因为如果合法,即使修改,也只能修改临时量,这样没有意义。
常量表达式是指值为常量,且在编译过程中就能得到结果的表达式。
const int a=20;
const int li=a+1;
const int lia= get_size(); //不是常量表达式,因为无法在程序编译过程中求的函数get_size的返回值。
同样,int const * a=nullptr为常量表达式,因为只有指针值不变,且指向的必须在编译时就能知道才可以。
int a;
int const * pr=a;也可以。
在c++11中新增了constexpr对常量表达式进行检测,
constexpr int *a=nullptr;
此时a为常量指针,constexpr把a变成顶层const指针.
之所以会这样,是因为常量表达式指针必须为常量,即为不可修改的值,指针不例外。
而const int *a 则是指向常量的指针,底层const指针(所谓顶层,可以理解为const修饰的是变量值,底层是指针指向的值,通过地址,内存地址一般为底层)。
typedef int * a;
const a b;
此时不等价于const int *b;
而是,b为一个常量指针,指向int;
const int *b中基本数据类型为int,*为修饰符,*b说明b为一个指针,const int说明是指向一个const int变量(也可能不是const变量,但无论如何都无法通过b修改此值)
而const a b 说明 a 是基本数据类型,a为int *,说明a为指向int 的指针,const说明b无法修改,即为常量。
const a *b
*b说明是指针,a说明是指向int *的指针,const说明无法修改指向的指针。