C++11规定,可以将变量声明为constexpr,用于编译器在编译阶段来验证变量的值是不是常量表达式。
因此,constexpr修饰的变量必须用常量or常量表达式来初始化。到目前为止,算数类型、指针、引用都可以定义为constexpr,而Io、自定义类、string等不可以。
constexpr int i = 20; //正确,20是常量表达式
constexpr int i2 = i + 1; //正确,i+1是常量表达式
constexpr int i3 = size(); //只有size()的返回值类型是constexpr,才正确
constexpr string s1 = ""; //错误
指针和引用定义为constexpr,初始化受到严格的规定。当指针定义成constexpr时,它的初始化值必须是nullptr or 0 or一个固定的地址。
constexpr修饰的指针是顶层const,而const修饰的指针是底层const
int i = 0;
const int j = 0;
int main()
{
int m = 0;
static int n = 0;
constexpr int *p = 0; //正确
constexpr int *p1 = nullptr; //正确
constexpr int *p2 = &i; //正确,i是全局变量,地址固定
constexpr int *p3 = &j;//错误,constexpr是顶层const,而j是const类型。应该是const int *p3 = &j;
constexpr int *p4 = &m; //错误,m是局部变量,地址不固定
constexpr int *p5 = &n; //正确,n的地址固定
return 0;
}