C++ const和constexpr
const expression , 常量表达式 , 在《C++ Primer》的定义:值不会改变并且在编译过程就能得到计算结果的表达式。 它要求两点:值不会改变,编译过程得到结果。 因此不是所有的const常量都是常量表达式。
1 const int max_files=20; // YES 2 const int limit = max_files + 1; //YES 3 const int sz = get_size(); // NO ,函数必须运行后才能得到结果(不考虑constexpr函数) ; 是常量,但是不是常量表达式
因此,我们引出constexpr关键字,来验证是否为一个const expression。
1 constexpr int mf = 20; 2 constexpr int limit = mf + 1; 3 constexpr int sz = size () ; // 当size()为constexpr函数时成立;
constexpr修饰变量,只能用字面值类型进行赋值(普通算术类型,指针,引用)。
尽管引用和指针都能定义成constexpr,但是初始值严格设置为nullptr,或者为某个固定地址(固定地址的含义:堆内存地址,常量区等,不是位于栈内存)。
constexpr如果修饰指针,那么表示常量指针,而不是指指针指向的内容。
1 const int *p=nullptr ; 2 constexpr int *q = nullptr ; // 指向常量的常量指针 3 4 int j=0; 5 constexpr int i = 42; 6 constexpr const int *p=&i; // 常量指针+指针常量
总结:对于修饰Object来说
- const并未区分出编译期常量和运行期常量。
- constexpr限定在了编译期常量
摘录: