在一个复杂的系统当中,很难分辨出一个初始值是不是常量表达式,当然我们可以定义一个const变量并且设置初始值为我们认定的某个常量表达式,但是在实际应用当中,我们常常会发现初始值并非时常量表达式的情况,C++11给我们提供了constexpr关键字以便由编译器来验证变量的值是否是一个表达式。
同const型变量一样,constexpr一旦声明必须初始化,一个constexpr型指针必须初始化为nullptr或者0,或者是存储在固定地址的变量。
这里到存储在固定位置的变量指的是,定义在所有函数体外的变量,或者是一类有效范围超过函数本身的变量,这些变量都是存储在固定位置的变量。
constexpr型变量对类型有着限制,这些类型一般比较简单,容易得到,称之为“字面值类型”,在我们常见的类型当中:算术类型、引用和指针都是字面值类型。而我们自定义的类、IO库、string等等类型则不是字面值类型。
我们必须注意一点,如果在constexpr声明中定义了一个指针,限定符仅仅对指针有效,而对指针所指向的对象无关:
上述的话的意思是,当我们定义了一个变量,且使用了constexpr,那么,这个constexpr把他所定义的指针置为了顶层const
下面我们看一下例子:
const int *p = nullptr; //p是一个指向整型常量的指针
constexpr int *q = nullprt; //q是一个指向整数的常量指针
constexpr const int *cp = nullptr; //cp是一个指向整型常量的常量指针