unsigned cnt=42;// 不是常量表达式
const int max_files=20; // max_files是常量表达式
const int limit=max_files+1; //limit是常量表达式
int staff_size =27; // staff_size不是常量表达式
const int sz=get_size(); // sz不是常量表达式,因为尽管sz本身是一个常量,但它的具体值直到运行时才能获取到,所以也不是
在一个复杂系统中,很难分辨一个初始值到底是不是常量表达式。当然可以定一个const变量并把它的初始值设为我们认为的某个常量表达式,但是实际使用时,却经常发现初始值并非常量表达式的情况。可以这么说,对象的定义和使用根本是两回事。
C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf=20;//20是常量表达式
constexper int limit=mf+1;mf+1是常量表达式
constxper int sz=size();//只有当size是一个constxper函数时才是一条正确的声明语句
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constxper类型