constexpr是C++11中添加的一个特性,其主要思想是通过在编译时而不是运行时进行计算来提高程序的性能,将时间花在编译上,而在运行时节省时间(类似于模版元编程)。
C++11规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
尽管不能使用普通函数作为constexpr变量的初始值,但C++11标准允许定义一种特殊的constexpr函数。这种函数应该足够简单以使得编译时就可以计算其结果,这样就能用constexpr函数去初始化constexpr变量了。
一般来说,如果你认定变量是一个常量表达式,那就把它声明成constexpr类型。
所有constexpr对象都是const对象,而并非所有的const对象都是constexpr对象。如果你想让编译器提供保证,让变量拥有一个值,用于要求编译期常量的语境,那么能达到这个目的的工具是constexpr,而非const。
constexpr函数是指能用于常量表达式的函数。定义constexpr函数的方法与其它函数类似,不过要遵循几项约定:函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句。constexpr函数或构造函数被隐式地指定为内联函数。
constexpr函数体内也可以包含其它语句,只要这些语句在运行时不执行任何操作就行。例如,constexpr函数中可以有空语句、类型别名以及using声明。
允许constexpr函数的返回值并非一个常量。constexpr函数不一定返回常量表达式。
和其它函数不一样,内联函数和constexpr函数可以在程序中多次定义。不过,对于某个给定的内联函数或者constexpr函数来说,它的多个定义必须完全一致。基于这个原因,内联函数和constexpr函数通常定义在头文件中。
constexpr函数只能调用其它constexpr函数,不能调用简单函数(simple function)。constexpr函数不应该是void类型。constexpr函数中不允许有前缀增量(++i),在C++14中已删除此限制。