C++中constexpr学习
转自:https://blog.csdn.net/janeqi1987/article/details/103542802
1.介绍
const和constexpr都可以来修饰对象和函数。constexpr表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:
constexpr int mf = 20; //20是常量表达式 constexpr int limit = mf + 1; // mf + 1是常量表达式 constexpr int sz = size(); //之后当size是一个constexpr函数时才是一条正确的声明语句
constexpr定义的变量值必须由常量表达式初始化;,constexpr是一个加强版的const,它不仅要求常量表达式是常量,并且要求是一个编译阶段就能够确定其值的常量。
#include <iostream> int main(void) { int x = 42; const int size = x; int buffer[size] = {};//clang: error: variable-sized object may not be initialized, 在gcc下可以编译过去,即使把const去掉也能编译过去 // 如果改为这种方式声明,gcc编译会报错: constexpr int size = x;//error: the value of ‘x’ is not usable in a constant expression; error: size of array ‘buffer’ is not an integral constant-expression }
修饰函数时:
constexpr可以用于含参和无参函数。constexpr函数适用于常量表达式,只有在下面的情况下编译器才会接受constexpr函数:
- 1.函数体必须足够简单,除了typedef和静态元素,只允许有return语句。如构造函数只能有初始化列表,typedef和静态元素 (实际上在C++14标准中已经允许定义语句存在于constexpr函数体内了)
- 2.参数和返回值必须是字面值类型