news 2026/9/3 0:18:45

【Effective Modern C++】第三章 转向现代C++:15. 尽可能使用constexpr

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Effective Modern C++】第三章 转向现代C++:15. 尽可能使用constexpr

constexpr作用于对象时,是加强版的const;但作用于函数时含义截然不同 —— 它并非简单限定 “返回const值” 或 “结果编译期可知”,而是根据调用场景动态适配。

  • constexpr对象:必然具备const只读属性,且必须由编译期可知的值完成初始化(技术上是翻译期,包含编译 + 链接,编程层面可视为编译期)。

  • constexpr函数:不保证返回值是 const,也不保证结果一定编译期可知—— 结果是否编译期确定,完全取决于传入的实参:

    • 若实参是编译期已知的常量 → 结果在编译期计算,可用于 “整型常量表达式” 语境;
    • 若实参是运行期才能确定的值 → 函数退化为普通函数,在运行期计算结果。

编译期可知的常量整型值,可用于 C++ 要求 “整型常量表达式” 的核心语境:数组尺寸、整型模板实参(如std::array的长度)、枚举量的值、对齐修饰符(alignas)等。普通const对象无法满足这些场景(仅保证只读,不保证编译期初始化),因此:

所有constexpr对象都是const对象,但并非所有const对象都是constexpr对象。

constexpr函数的特性与限制:

  1. 适用语境:可同时适配 “编译期常量计算” 和 “运行期普通计算”,无需为两种场景编写不同函数;

  2. 类型限制:仅能接收和返回字面值类型(即编译期可确定值的类型,如内置类型、符合条件的自定义类型);

  3. 实现限制(C++ 版本差异):

    • C++11:函数体仅允许 1 行 return 语句,需用三元运算符替代 if-else、递归替代循环;
    • C++14:限制大幅放宽,支持循环、局部变量、void 返回值,甚至允许修改对象状态的成员函数(如自定义类型的 setter)。

自定义类型对constexpr的支持:

  • C++11:仅构造函数、返回字面值类型的const getter可声明为constexpr(成员函数隐式const);
  • C++14:可将修改对象状态的setter声明为constexpr(void 返回值也允许),能基于编译期对象完成更复杂的编译期计算(如Point类的中点、镜像点计算)。

注意:constexpr是对象 / 函数接口的核心组成部分—— 声明后若随意移除(如函数新增 I/O 语句),依赖它的客户端代码(如用在模板参数、数组大小)会直接编译失败,需长期遵守。

总结

  • constexpr对象都具备const属性,并由编译期已知的值完成初始化。
  • constexpr函数在调用时若传入的实参值是编译器已知的,则会产出编译期结果。
  • 比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。

原著在线阅读地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:22:29

Java springboot基于微信小程序的校园导航系统(源码+文档+运行视频+讲解视频)

文章目录 系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈 后端框架springboot前端框架vue持久层框架MyBaitsPlus微信小程序介绍系统测试 四、代码参考 源码获取 目的 校园导航系统是智慧校园建设的重要组成部分。本系统基于Java Spring Boot框架与微信…

作者头像 李华
网站建设 2026/9/2 22:27:18

Clawdbot汉化版企业实操:制造业设备报修微信群AI自动分派工单

Clawdbot汉化版企业实操:制造业设备报修微信群AI自动分派工单 在制造业现场,设备突发故障是家常便饭。维修工单靠人工电话通知、微信文字转达、Excel表格登记——响应慢、信息漏、责任不清、复盘难。某汽车零部件厂曾因一台CNC加工中心停机2小时未及时上…

作者头像 李华
网站建设 2026/8/26 17:25:54

Open Interpreter未来趋势预测:本地AI编程部署前景展望

Open Interpreter未来趋势预测:本地AI编程部署前景展望 1. Open Interpreter是什么:让自然语言真正变成可执行代码的本地引擎 Open Interpreter 不是一个新概念的玩具,而是一套已经跑在成千上万台电脑上的“本地AI编程操作系统”。它不依赖…

作者头像 李华
网站建设 2026/8/29 6:01:59

构建卓越通信体验:移动端开发工程师(IM系统方向)的核心能力与实践

上海辰锐信息科技有限公司 移动端开发工程师 职位信息 岗位职责: 1.负责IM系统设计:架构设计、技术选型、演进规划、安全性框架、高可用架构等; 2.负责移动端应用程序的开发、测试、交付等; 3.参与移动端功能设计开发规范的制定、实施及优化; 4.负责团队技术指导与跨团队沟…

作者头像 李华
网站建设 2026/9/2 21:25:35

AD导出Gerber文件教程:新手必看的EDA输出流程

以下是对您提供的博文《AD导出Gerber文件教程:新手必看的EDA输出流程技术分析》进行 深度润色与专业重构后的版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有工程师现场感 ✅ 摒弃“引言/核心知识点/应用场景/总结”等模板化结构,代之以 …

作者头像 李华
网站建设 2026/9/2 19:45:21

一文说清多层感知机如何实现组合逻辑门

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,采用真实工程师口吻、教学博主风格撰写,逻辑层层递进,语言自然流畅,兼具理论严谨性与工程实操感。所有术语、公式、代码、表格均保留并优化表达,同时强化了“为什么这么…

作者头像 李华