常量表达式(const expression)是指值不会改变并且在编译过程中就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是也是常量表达式。
一个对象(或表达式)是否是常量表达式由数据类型和初始值共同决定。
——《C++primer》P58
constexpr变量
对于是否是常量表达式的界定显得很不清晰。我们可以利用constexpr类型显式验证。
例如:
constexpr int mf = 20;//正确,20是常量表达式
constexpr int limit = mf+1;//正确,mf+1是常量表达式
constexpr int sz = size();//只有size是constexpr函数时成立
除了变量同样能声明constexpr指针,这种指针的特点是该指针指向内容的地址固定不变。有点类似与底层const指针。
constexpr函数
constexpr函数是指能够用于常量表达式的函数,函数的返回类型及所有形参的类型都得是字面值类型,而且函数体内只能有且只有一条return语句。
constexpr int new_sz(){return 42;}//constexpr函数
constexpr size_t scale(size_t cnt){return new_sz()*cnt;}//constexpr函数但不一定返回常量表达式
int arr[scale(2)];//正确 scale(2)是常量表达式
int i = 2;
int a2[scale(i)];//错误:scale(i)不是常量表达式
因此,constexpr函数需要放在头文件中,因为代码段在调用时,需要知道该函数的定义。