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 @   lypbendlf  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示