const容易混乱的地方在于底层const和顶层const概念。以及const与新标准中constexpr的区分。
顶层const和底层const
int *const p1 = &i; // 顶层
cosnt int ci = 42; // 顶层
const int *p2 = &ci; //底层
int const *p2 = &ci; //底层, effetive c++提示
const int *const p3 = p2; //两层
对此,effective c++给出一种好记的方法: 星号*左边是底层,星号*右边是顶层
底层/顶层在拷贝时的差异
int i = ci; //correct, ci是顶层const
p2 = p3; //correct, p2和p3都具有底层const语义,可以拷贝
const和constexpr
constexpr仅对指针本身有效,即只能产生顶层const语义
const int *p1 = nullptr;//底层
constexpr int *p2 = nullptr;//顶层
constexpr const int *p = &i;// 两层
所以顶层const语义一般使用constexpr代替,而底层const语义使用const定义。也可以把顶层语义称为常量,把底层语义称为不能修改?