c++程序中的某些词具有特殊的含义,这些词被称为关键字-keyword。
为什么需要constexpr关键字?
constant expressions 是一种表达式,其值不能改变,并且可以在编译时求值。字面量是一个常量表达式。从常量表达式初始化的const对象也是常量表达式。在大型系统中,很难确定初始化式是否为常量表达式。在定义const变量时,我们认为可以使用一个是常量表达式的初始化式,来进行初始化,使得该const变量也是一个常量表达式。但是,当在需要常量表达式的上下文使用该变量时,可能会发现初始化式不是常量表达式。一般来说,对象的定义及其在这种上下文中的使用可以完全分开。因此有了constexpr variables。
在新标准下,我们可以要求编译器通过在constexpr声明中声明一个变量来验证该变量是否是一个常量表达式。声明为constexpr的变量是隐式const,必须通过常量表达式初始化。虽然不能使用普通函数作为constexpr变量的初始化式,但新标准允许将某些函数定义为constexpr。这样的函数必须足够简单,以便编译器可以在编译时对其求值。我们可以在constexpr变量的初始化式中使用constexpr函数。
Note:最佳实践,通常,对于打算用作常量表达式的变量,使用constexpr是一个好主意。
Pointers and constexpr:重要的是要理解,当我们在constexpr声明中定义指针时,constexpr说明符适用于指针,而不是指针所指向的类型。像任何其他常量指针一样,constexpr指针可以指向const或非const类型。
constexpr函数:constexpr函数是可用于常量表达式的函数。constexpr函数的定义与其他函数类似,但必须满足某些限制。当它可以这样做时,编译器将用其结果值替换对constexpr函数的调用。为了能够立即展开函数,constexpr函数是隐式内联的。constexpr函数体可以包含其他语句,只要这些语句在运行时不生成操作。例如,constexpr函数可能包含空语句、static_assert声明、typedef类型别名和using声明。允许constexpr函数返回一个非常量的值。请注意:constexpr函数不需要返回常量表达式。与其他函数不同,内联函数和constexpr函数可以在程序中多次定义。因此,constexpr函数用于生成constexpr对象以及constexpr函数的形参或返回类型。
constexpr constructors:虽然构造函数不能是const成员函数,但字面值类类型中的构造函数可以是constexpr函数。字面值类类型必须至少提供一个constexpr构造函数。constexpr构造函数可以声明为= default(或声明为已删除函数)。否则,constexpr构造函数必须满足构造函数的要求——这意味着它不能有返回语句。因此,constexpr构造函数的主体通常为空。我们通过在constexpr构造函数声明之前加上关键字constexpr来定义它。constexpr构造函数用于生成constexpr对象以及constexpr函数的形参或返回类型。
温馨提示:答案为网友推荐,仅供参考