什么是常量表达式:
常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:
const int a=20; //a是常量表达式
const int b=a+1;//b是常量表达式
int c=2; //c不是常量表达式,因为数据类型是普通int
const int d= get_size();//d不是常量表达式,因为get_size()的值要到运行才知道
constexpr变量:
由于复杂环境下,难以分辨是不是常量表达式。c++11新标准允许将变量声明为constexpr类型一便于编译器验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个变量,必须用常量表达式初始化。
相应地,有constexpr函数可以初始化constexpr变量。声明constexpr时用到的类型就称为字面值类型。
自定义类,io库,string都不属于这类,算术类型和指针、引用属于。
指针与constexpr
constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
假如在constexpr声明中定义了一个指针,限定符只对指针有效,所指的对象无关。
const int *p = nullptr; //p是一个指向整形常量的指针
constexpr int *q = nullptr; //q是一个指向整数的常量指针