常量表达式指在编译阶段就能获得值的一种表达式,表达式的值是不可改变的。express
const int max_files = 20; //yes const int limit = max_files + 1; //yes int staff_size = 27; //no const int sz = get_size(); //no
C++11引入了新关键字constexpr,用constexpr声明的变量是const的,且必须用常量表达式来初始化。因此,constexpr声明的对象必须是全局对象(不在任何函数体内)。函数
constexpr int mf = 20; //20 is a constant expression constexpr int limit = mf + 1; //mf+1 is a constant expression constexpr int sz = size(); //ok only if size is a constexpr function
若是用constexpr来声明指针的话,constexpr做用于指针自己,而不是指针指向的对象。参考个人博文:C++ 指针
spa
const int *p = nullptr; //p is a pointer to a const int constexpr int *q = nullptr; //q is a const point to int
int i = 5; int k = 7; constexpr int j = 42; int main() { constexpr int *p1 = &i; //p1是const指针,而不是指向const对象的指针 *p1 = 6; cout << *p1 <<endl; //output 6 cout << i <<endl; //output 6 constexpr const int *p = &i; //p是指向const对象的的const指针 *p = 10; //error,指向const对象 p = &k; //error,const指针,不能指向新对象 }