2.4.4 constexpr 和常量表达式
常量表达式
指值不会改变,且在编译过程中就能得到计算结果的表达式,如:
const int max_files = 20; // max_files是常量表达式 const int limit = max_files + 1; // limit是常量表达式 int staff_size = 27; // staff_size不是常量表达式,因为得到的值是普通的int,而不是const int const int sz = get_size(); // sz不是常量表达式,虽然sz是常量,但具体的值到运行时才能获取到,所以也不是。
constexpr变量
是常量表达式安全性的升级。因为在复杂系统中很难分辨一个初始值到底是不是常量表达式。虽然可以用const来定义,但在使用时依然会发生初始值不是常量表达式的情况。可以说,在这种情况下,对象的定义和使用是两回事。
C++11规定,允许将变量声明为constexpr类型,以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = 20; // 20是常量表达式 constexpr int limit = mf + 1; // mf+1是常量表达式 constexpr int sz = size(); // 只有当size是一个constexpr函数时才是一条正确的声明语句