更多c++后台开发知识点,请参考我的博客:https://blog.csdn.net/ypshowm
常量表达式是指值不会改变且在编译过程就能得到计算结果的表达式。显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。
在一个复杂的系统中,很难分辨一个初始值到底是不是常量表达式,因此
c++11规定:允许将变量声明为constexpr类型,以由编译器来验证变量的值是否是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:
constexpr int mf = 20; //20是常量表达式
constexpr int limit = mf + 1; //mf+1是常量表达式
cosntexpr int sz = size(); //只有当size是一个constexpr函数时,这条语句才正确
由于常量表达式的值需要在编译时就得到计算,因此声明constexpr时用到的类型必须有所限制。
算术类型,引用和指针属于字面值类型,自定义的类如IO库,string类型等不属于字面值类型,不能被定义成constexpr;
对引用和指针的限制:一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象。
函数体内定义的变量一般来说是并非存放在固定地址中,因此constexpr指针不能指向这样的变量。相反,所有函数体之外的对象其地址固定不变,能用来初始化constexpr指针