cv 限定符

cv(const 与 volatile)类型限定符 | cppreference.com

cv 限定符是 constvolatile 的合称。

当对象最初被创建时,所用的 cv 限定符决定对象的常量性或易变性。

const 大家都懂,就是不能修改的常量 (constant),直接修改会编译报错,间接修改(如利用 const_cast<int&> 等手段)为未定义行为。还有一点,就是写为 const 之后,编译器会进行优化。

volatile 翻译过来是“易变”的,表明该变量可能通过软件甚至硬件方式变化。这会阻止编译器对这个变量进行任何优化,包括但不限于:不会将变量放到寄存器中;不会对 const volatile 变量当做 const 进行优化。(不过,CPU 仍可以将变量放入缓存中,因为缓存对程序员是透明的)

代码例子见 const_cast 部分。

C99 的 const

1
2
const int n = 10;
int a[n];

上面的代码不能通过 C99 标准的 C 编译器(以及 C++ 编译器)。
因为 C99 对 const 的定义为只读的变量(而不是常量)。

const 和 constexpr

C: #define ll long long
C++: ‘const int k=5;’

const中可以有变量名,但constexpr的表达式中不能有变量(可以有常量),因为:

constexpr 在编译时进行初始化,const 在运行时初始化

底层const 和顶层 const

不是很懂,感觉没用