跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

现代 C++ 新特性 constexpr:从 C++11 到 C++20 的演进

constexpr 关键字自 C++11 引入以来经历了多次重大升级。C++11 严格限制函数体仅含 return 语句,C++14 放宽至支持局部变量与循环,C++17 扩展至 Lambda 表达式,C++20 则支持动态内存分配与 mutable 成员。这些演进将更多计算任务移至编译期,显著提升运行时性能并增强元编程能力。

禅心发布于 2026/3/24更新于 2026/7/2232 浏览
现代 C++ 新特性 constexpr:从 C++11 到 C++20 的演进

一、C++11 中的 constexpr

1. 常量表达式与 constexpr 概念

现代 C++ 从 C++11 开始引入 constexpr,旨在将计算任务从运行时转移到编译时。常量表达式是指值在编译期就能确定的表达式,比如字面量或常量初始化。

const int a = 1; // a 是常量表达式
const int b = a + 1; // b 也是
int c = 1;
const int d = c; // d 不是,因为 c 的值可能在运行前被修改

编译器会对常量表达式进行优化,直接替换为数值。通过汇编对比可以发现,使用常量表达式的代码在运行时不再包含计算逻辑。

constexpr 关键字用于指定变量必须是常量表达式。它修饰的变量必须用常量或常量表达式初始化,否则编译报错。

注意:const 分为顶层 const(对象本身不可变)和底层 const(指向的对象不可变)。指针被 const 修饰时,* 左侧为底层 const,右侧为顶层 const。

2. constexpr 修饰函数

C++11 中,constexpr 函数默认是 inline 的,但限制极其严格:

  • 参数和返回值必须是字面类型(整型、浮点型、指针等)。
  • 函数体只能有一条 return 语句。
  • 不能有局部变量、循环或条件分支。
  • 必须有返回值且为常量表达式。

只有当结果被 constexpr 变量接收时,才会触发编译期计算;否则退化为普通函数调用。

constexpr int func1() {
    return 1;
}

constexpr int func2(int x) {
    return x + 10;
}

int main() {
    constexpr int a = func1();
    constexpr int b = func2(10);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    return 0;
}

此外,constexpr 还可用于构造函数、成员函数和模板。构造函数要求所有成员初始化为常量表达式且函数体为空;成员函数自动变为 const 且不能是虚函数。

二、C++14 的进化

C++14 大幅放宽了 constexpr 的限制,使其更接近普通函数:

  • 允许声明和初始化局部变量。
  • 支持 if、for、while、switch 等控制流。
  • 允许多条 return 语句。
  • 返回类型可以是 void 或复合类型(如 std::array)。
constexpr int func(int n) {
    if (n == 1 || n == 2) {
        return n;
    }
    int ret = 1; // 允许局部变量
    for (int i = 2; i <= n; i++) {
        ret *= i;
    }
    return ret; // 允许多条 return
}

int main() {
    constexpr int a = func(5);
    std::cout << a << std::endl;
    return 0;
}

三、C++17 的扩展

C++17 进一步模糊了编译时与运行时的界限,核心突破是支持 constexpr Lambda 表达式:

  • 捕获列表必须是常量表达式。
  • 函数体需满足 constexpr 函数的其他要求。
int main() {
    constexpr int a = 10;
    constexpr auto func = [a](int x) constexpr {
        return x * a;
    };
    constexpr int b = func(5);
    std::cout << b << std::endl;
    return 0;
}

四、C++20 的革命性更新

C++20 对 constexpr 进行了重大升级,使其成为元编程的核心工具:

  1. 动态内存分配:支持 new/delete,但分配的内存必须在编译期内释放。这为 STL 容器在编译期的实现提供了可能。
  2. 异常处理:支持 try-catch,但异常必须在编译期捕获,不能传播到运行时。
  3. mutable 成员:允许在 constexpr 成员函数中修改标记为 mutable 的成员变量。
  4. 虚函数:首次支持 constexpr 虚函数,实现了编译期的多态调用。

尽管 C++23 已发布,但部分编译器支持仍在完善中。随着标准的演进,constexpr 将继续提升 C++ 的性能上限与表达能力。

目录

  1. 一、C++11 中的 constexpr
  2. 1. 常量表达式与 constexpr 概念
  3. 2. constexpr 修饰函数
  4. 二、C++14 的进化
  5. 三、C++17 的扩展
  6. 四、C++20 的革命性更新
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 爬虫与大模型结合实践:从基础提取到框架应用
  • ComfyUI 集成 Stable Diffusion 3.5 FP8 全流程实测,出图速度提升 50%
  • 可持续发展与CV:绿色AI模型设计
  • 基于 OpenCV 的 Python 自动扫雷实现
  • MySQL 锁机制详解:从 S 锁 X 锁到 Next-Key Lock 与死锁排查
  • 如何成为懂 AI 的产品经理
  • Linux 网络基础:协议、模型与地址管理详解
  • Java 队列:原理、实现与高频实战
  • Windows 部署 OpenClaw 集成 DeepSeek 与飞书实现本地 AI 控制
  • 用 ClawdBot 和 MoltBot 在本地部署粤英翻译 Telegram 机器人
  • UML 中四种核心关系辨析:关联、聚合、组合与依赖
  • C++ 哈希表封装:模拟实现 unordered_map 与 unordered_set
  • 统一接口与成本优化:大模型接入实战指南
  • 线性 DP 经典四题详解:台阶、子段和、传球与乌龟棋
  • 多模态 AI 应用:图文音视频一体化开发实战
  • openJiuwen 企业级 Agent 平台深度解析:从架构设计到实战部署
  • 2024 大模型典型示范应用案例集
  • 远程工具横评:UU 远程 2026 年 1 月升级体验与竞品对比
  • 基于 Java 和 Leaflet 的湖南省道路长度 WebGIS 构建
  • 当看到 Bug 背后的真相,我选择了沉默

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online