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.参数和返回值必须是字面值类型

 

posted @ 2024-05-07 23:56  lypbendlf  阅读(33)  评论(0编辑  收藏  举报