快速导航×

C++ constexpr和const有什么区别?C++编译期常量使用指南【C++11】2025-12-16 17:11:02
constexpr 是编译期常量表达式,const 是运行时不可修改对象;前者必须在编译期求值并用于模板参数、数组大小等场景,后者仅保证初始化后不被修改,值可来自运行时。

c++ constexpr和const有什么区别?c++编译期常量使用指南【c++11】

constexprconst 都表示“不可变”,但本质完全不同:前者是**编译期可求值的常量表达式**,后者只是**运行时不可修改的对象**。简单说,const 不一定在编译期知道值,constexpr 一定在编译期就知道值且能参与编译期计算

const:只保证“不修改”,不保证“编译期可知”

const 变量只要求初始化后不能被修改,但它的值可以来自运行时——比如函数返回、用户输入、随机数等。

  • int x = 42; const int a = x; // ✅ 合法,但 a 不是编译期常量
  • const int b = rand(); // ✅ C++11 起允许(只要类型支持),但 b 仍不是编译期常量
  • int arr[a]; // ❌ 错误!a 不是常量表达式,不能用作数组长度

constexpr:强制“编译期可算出”,用途更严格也更强大

constexpr 变量必须用常量表达式初始化;constexpr 函数/构造函数,编译器会尝试在编译期求值(若参数满足条件)。

Gaga Gaga

曹越团队开发的AI视频生成工具

Gaga 1151 查看详情 Gaga
  • constexpr int c = 42; // ✅ 编译期常量,可用作数组大小
  • int arr[c]; // ✅ 合法(C++11 起支持)
  • constexpr int square(int n) { return n * n; } // C++11 允许,但仅限简单表达式
  • constexpr int d = square(5); // ✅ 编译期算出 25
  • int y = 3; constexpr int e = square(y); // ❌ 错误!y 不是常量表达式

关键区别总结(C++11 视角)

  • const 变量可以是非字面类型(如自定义类),但不能用于需要常量表达式的地方(模板非类型参数、case 标签、数组大小等)
  • constexpr 变量必须是字面类型(literal type),且初始化必须是常量表达式;它能用在所有需要编译期常量的上下文中
  • const 函数(成员函数)表示不修改对象状态;constexpr 函数表示“可能在编译期求值”——二者语义完全无关
  • 一个变量可以同时是 const 和 constexpr(推荐写法):constexpr const int x = 42; ——但通常直接写 constexpr 更清晰

实用建议:什么时候用哪个?

  • 要定义一个**编译期已知的整数、指针或简单结构体**(比如数组大小、模板参数、case 值)→ 用 constexpr
  • 只想防止运行时意外修改某个局部/成员变量 → 用 const(更轻量,兼容性更好)
  • 函数逻辑简单、参数确定时希望编译期优化 → 尝试加 constexpr(C++11 限制多,C++14 后更宽松)
  • 不确定是否能编译期求值?先写 constexpr,编译器会报错提醒你哪里不满足常量表达式要求

基本上就这些。记住核心:const 是运行时契约,constexpr 是编译期承诺。

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

以上就是C++ constexpr和const有什么区别?C++编译期常量使用指南【C++11】的详细内容,更多请关注其它相关文章!


# 自定义  # 养生茶seo  # 黑龙江网站优化团队推荐  # 灶具营销推广方案策划  # 网站运营推广该如何做  # 怎样做网站建设工作  # 东光网站建设设计  # asp网站建设助理招聘  # 网站建设万和  # 贵阳专业网站seo优化网站  # 合肥推广营销方法  # c++  # 中文网  # 相关文章  # 修饰符  # 什么时候  # 随机数  # 有什么  # 什么用  # 有什么区别  # 求值  # 区别 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  从J*aScript对象中精确提取指定属性的教程  谷歌google账号怎么注册账号 谷歌账号注册官方流程  Python Socket多播通信中指定源IP地址的实践指南  解决J*aScript中重复选择项的确认对话框显示问题  C#中解析不规范的HTML为XML 常见的坑与解决办法  深入理解Go语言中的指针类型:以*string为例  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  C++ string清空内容_C++ clear与empty用法  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  J*aScript教程:根据元素文本内容动态设置背景色  照顾宝贝2小游戏点击立即在线玩  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  mc.js官网登录入口 mc.js官方登录入口最新版  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  免费抖音短视频入口_抖音网页版短视频免费通道  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  菜鸟取件码是什么怎么查 最全查询渠道汇总  j*a toString()的覆盖  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  ArrayList与LinkedList核心操作的Big-O复杂度分析  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  在Go Martini框架中高效服务动态生成图像的实践指南  必由学登录入口 必由学官方网站在线访问链接  利用Bokeh CustomJS动态控制DataTable列可见性  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  Log4j Console Appender性能瓶颈与高并发优化策略  微信语音通话掉线如何解决 微信语音通话稳定优化方法  Shopify Liquid:高效管理与访问产品变体数组属性  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  漫蛙网页登录入口 漫蛙漫画官方授权网址  必由学官方平台入口 必由学在线课堂登录地址  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】  Tailwind CSS line-clamp 布局问题解析与修复指南  J*a实现学校排课程序_面向对象结构化项目示例  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  理解Python模块与全局变量的作用域管理  知音漫客正版漫画平台_知音漫客官网账号登录  Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧  excel如何生成目录 excel一键生成工作表目录超链接  Python实时数据流中的动态最值查找策略  我的世界官方游戏入口 我的世界官网平台直达链接