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

constexpr 和 const 都表示“不可变”,但本质完全不同:前者是**编译期可求值的常量表达式**,后者只是**运行时不可修改的对象**。简单说,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
曹越团队开发的AI视频生成工具
1151
查看详情
- constexp
r 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性能瓶颈与高并发优化策略


2025-12-16
浏览次数:次
返回列表
r int c = 42; // ✅ 编译期常量,可用作数组大小