新闻中心

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

2025-12-16
浏览次数:
返回列表
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++  # 中文网  # 相关文章  # 修饰符  # 什么时候  # 随机数  # 有什么  # 什么用  # 有什么区别  # 求值  # 区别 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 押井守高度称赞《辐射4》:玩了八年都停不下来!  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  如何有效阻止外部脚本意外修改内联样式的高度属性  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  Go语言JSON解析深度指南:动态访问与结构体映射实践  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  J*aScript实现动态背景色下的文本与按钮颜色自适应调整  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  Tailwind CSS line-clamp 布局问题解析与修复指南  顺丰快递查询系统 官方正版查询入口  Steam官网入口直达 Steam注册及登录步骤  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  VS Code远程开发时如何处理文件权限问题  如何使用纯J*aScript判断Input元素是否在特定类容器内  在VS Code中配置和运行Dart程序的完整步骤  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  PHP URL参数传递与500错误调试指南  TikTok网页版直接登录 TikTok网页端官方平台入口  蛙漫安全无毒 官方认证的绿色入口  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  使用Python高效删除Word宏并转换DOCM为DOCX格式  美团外卖商家服务中心入口 美团商家版官网入口  深入理解J*a链表中的IPosition接口与使用  CSS实现侧边栏导航项全宽圆角悬停背景效果  yy漫画网页版官方入口_yy漫画官网登录页面链接  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  2026年CSGO开箱网站推荐 CSGO开箱平台精选  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  创客贴用户入口官网登录 创客贴网页版电脑版系统  c++中为什么推荐使用using替代typedef_c++现代化类型别名  PDF文件体积过大处理_PDF压缩技巧详解  Spyder启动失败:字体文件权限拒绝错误解决方案  蛙漫移动版在线看 蛙漫手机浏览器直达入口  Composer如何解决json扩展缺失的错误  Yandex浏览器官方网页版入口 Yandex浏览器最新版官网  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  AO3网页版最新入口合集 Archive of Our Own在线访问指南  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  解决J*aScript中重复选择项的确认对话框显示问题  深入理解Go语言中的指针类型:以*string为例  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  如何使用Go和Martini动态服务解码后的图片  Log4j Console Appender性能瓶颈与高并发优化策略 

搜索