C++中的constexpr有什么用?(编译期常量)

发布时间 - 2026-01-05 00:00:00    点击率:
constexpr 使计算在编译期完成,生成真正常量;要求变量或函数入参均为编译期常量,支持数组大小、模板参数等场景,并区别于 const(运行时只读)和 consteval(强制仅编译期调用)。

constexpr 让你把计算搬到编译期完成,生成真正的常量,不是运行时才确定的“只读变量”。

让变量成为编译期常量

加了 constexpr 的变量,必须在编译期就能算出值,否则报错。它比 const 更严格——const 只保证不修改,值可以来自运行时(比如函数返回);而 constexpr 强制要求值已知、不可变、可参与编译期逻辑。

  • int x = 5; constexpr int y = x * 2; → 错误:x 不是编译期常量
  • constexpr int a = 10; constexpr int b = a + 3; → 正确:所有值都确定,b 就是 13,存进符号表,不占运行时内存

让函数支持编译期求值

标记为 constexpr 的函数,不等于“只能在编译期调用”,而是“如果入参都是编译期常量,就尝试在编译期算出结果”。它写法受限(C++14 后宽松很多),但好处明显:

  • 能用在需要常量表达式的地方:数组大小、模板非类型参数、case 标签等
  • 避免重复运行时计算:同一个 constexpr 函数被多处以常量调用,编译器只算一次
  • 例如:constexpr int square(int n) { return n * n; } int arr[square(5)]; → 合法,arr 是长度为 25 的数组

让类和构造函数参与编译期构建

C++11 起支持 constexpr 构造函数,只要所有成员都能用常量初始化,整个对象就能是编译期常量。C++20 还允许 constexpr 成员函数中使用循环、局部变量甚至 try-catch(有限制)。

立即学习“C++免费学习笔记(深入)”;

  • 常见用途:定义编译期字符串、固定大小容器、数学常量类型(如 constexpr Vec3{1,0,0}
  • 关键点:所有数据成员必须是字面类型(literal type),且构造过程不能有副作用

和 const、consteval 的区别

const 是运行时只读语义;constexpr 是编译期可求值能力;consteval(C++20)更进一步——强制只能在编译期调用,哪怕传入运行时值也会编译失败。

  • 想写一个“保证不产生运行时开销”的工具函数?用 constexpr
  • 想确保某个值绝对进符号表、零成本?优先声明为 constexpr 变量
  • 想彻底禁止运行时调用(比如加密密钥生成逻辑)?选 consteval

基本上就这些。它不是语法糖,是让编译器“看懂你的意图”,从而优化、验证、甚至提前报错的关键机制。


# 工具  # c++  # 区别  # 常量  # 成员函数  # 构造函数  # try  # catch  # const  # 局部变量  # 字符串  # int  # 循环  # 对象  # 就能  # 能在  # 时计  # 报错  # 都是  # 也会  # 求值  # 均为  # 能有  # 你把 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: node.js报错:Cannot find module 'ejs'的解决办法  网站制作企业,网站的banner和导航栏是指什么?  黑客入侵网站服务器的常见手法有哪些?  Python正则表达式进阶教程_复杂匹配与分组替换解析  如何将凡科建站内容保存为本地文件?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Python结构化数据采集_字段抽取解析【教程】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Python面向对象测试方法_mock解析【教程】  微信小程序 闭包写法详细介绍  如何在IIS中配置站点IP、端口及主机头?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  长沙做网站要多少钱,长沙国安网络怎么样?  Python并发异常传播_错误处理解析【教程】  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel怎么使用artisan命令缓存配置和视图  b2c电商网站制作流程,b2c水平综合的电商平台?  如何登录建站主机?访问步骤全解析  如何在宝塔面板创建新站点?  如何快速登录WAP自助建站平台?  网站页面设计需要考虑到这些问题  JS经典正则表达式笔试题汇总  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Python进程池调度策略_任务分发说明【指导】  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  北京网站制作公司哪家好一点,北京租房网站有哪些?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  nginx修改上传文件大小限制的方法  焦点电影公司作品,电影焦点结局是什么?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  重庆市网站制作公司,重庆招聘网站哪个好?  如何挑选高效建站主机与优质域名?  Laravel安装步骤详细教程_Laravel环境搭建指南  在线制作视频的网站有哪些,电脑如何制作视频短片?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Java垃圾回收器的方法和原理总结  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  网站制作软件有哪些,制图软件有哪些?  网站制作报价单模板图片,小松挖机官方网站报价?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  高防服务器租用指南:配置选择与快速部署攻略