自 C++11起,constexpr 可用来让表达式核定于编译期。例如:
constexpr int square (int x)
{
return x*x;
}
float a[square(9)];//此数组大小为81
这个关键字修正了在C++98中使用数值极限时出现的问题,在C++11之前,如下代码:
std::numeric_limits<short>::max()
无法被用作一个常量,虽然他在功能上等同于宏 INT_MAX。如今,在C++11中,这样的一个式子被声明为constexpr,于是,你可以声明array或进行编译期运算。
例如:
std::array<float,std::numeric_limits<short>::max()> a;
const 的基础用法:
const的作用:
1.对变量声明只读特性,以保护值以防被修改。(const 声明的变量只能作为右值而不能做值)。
2.const 修饰的变量在程序运行过程中只有一份拷贝,避免了不变要的内存分配。
3.编译器不为普通的const常量分配储存空间,而是将他们保存在符号表中,这使得它成为了一个编译期常量,在程序期间不用进行频繁的储存和读取内存操作,提高程序的与运行效率。
const 与 constexpr 的区别:
对于 const 没有区分出定义的常量(函数)是编译期常量(函数)还是运行期常量(函数)
对于 constexpr 修饰的常量一定是在编译期常量,但修饰的函数返回值却不一定是编译期常量。
对于constexpr 修饰的函数,如果返回值可在编译期计算出结果,那么在编译器便会在编译期进行计算,若不能得出结果,则就是运行期计算。