C++中的constexpr和const有什么区别?(编译期常量)
技术百科
尼克
发布时间:2026-01-01
浏览: 次 constexpr 表示编译期可求值,const 仅表示运行期不可修改;constexpr 要求初始化表达式必须在编译期完全求值且隐含 const,而 const 变量未必是编译期常量。
constexpr 表示“编译期可求值”,而 const 仅表示“运行期不可修改”——这是最核心的区别。
const 只保证不可变,不保证编译期可知
声明为 const 的变量,只要初始化表达式不是编译期常量,它就只是运行期的只读变量。比如:
int x = 42; const int a = x; // 合法,但 a 不是编译期常量 constexpr int b = x; // 错误!x 不是编译期常量
这里 a 是 const,但无法用在需要编译期常量的上下文中(如数组大小、模板非类型参数)。
constexpr 要求编译期可计算,且隐含 const
所有 constexpr 变量自动是 const 的,但它还额外
要求:初始化表达式必须能在编译期完全求值。例如:
constexpr int c = 10 + 20; // ✅ 编译期算出 30 constexpr int d = std::sqrt(16); // C++20 起 ✅(若 sqrt 是 constexpr 版本) constexpr int e = rand(); // ❌ 运行期函数,不满足
注意:constexpr 函数或构造函数也需满足“在传入编译期常量时能返回编译期常量”这一约束。
使用场景差异明显
-
const常用于接口设计,表达“这个值我不会改”,比如函数参数、成员变量; -
constexpr专用于需要编译期确定值的地方:数组长度、模板参数、static_assert条件、case标签等; - 类的
constexpr构造函数允许创建字面类型(literal type)的对象,并在编译期初始化; - C++20 起,
constexpr支持更复杂的逻辑(如循环、动态内存分配),但前提是所有输入和路径都满足编译期求值条件。
小结:关键判断标准
- 能否用在
int arr[N];中的N?只有constexpr(或字面类型的const整型静态常量)可以; - 能否作为模板实参?如
std::array?必须是constexpr或等价的编译期常量; - 是否允许运行期初始化?
const允许,constexpr不允许(除非是 C++23 的 relaxed constexpr 某些情况); - 是否隐含
const?是的,constexpr变量一定是const的(但反过来不成立)。
# 这是
# 能在
# 这一
# 我不会
# 并在
# 它就
# 它还
# 用在
# 循环
# 对象
# c++
# int
# 实参
# 区别
# 构造函数
# 接口
# 成员变量
# 整型
# const
# 常量
# Array
# 求值
# 不满足
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10电脑怎么设置IP地址_Windows10
- c++20的std::format怎么用 比pri
- 如何在 Windows 11 中使用 AlomWa
- Linux如何使用Curl发送请求_Linux下A
- mac怎么打开终端_MAC终端Terminal使用
- Python多进程教程_multiprocessi
- Win11快速助手怎么用_Win11远程协助连接教
- Windows10如何更改开机密码_Win10登录
- Go语言中正确反序列化多个同级XML元素为结构体切
- Windows10电脑怎么设置防火墙出站规则_Wi
- PowerShell怎么创建复杂的XML结构
- 如何理解Go指针和内存分配关系_Go Pointe
- PHP中require语句后直接调用返回对象方法的
- Windows怎样拦截WPS弹窗广告_Window
- 如何在JavaScript中动态拼接PHP的bas
- Python配置文件操作教程_JSONINIYAM
- 如何在 Go 中正确测试带 Cookie 的 HT
- Windows蓝屏错误0x00000018怎么处理
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- 微信里的php文件怎么变mp4_微信接收php转m
- LINUX怎么查看进程_LINUX ps命令查看运
- Windows10如何删除Windows.old_
- Go 中实现 Python urllib.quot
- Linux如何申请SSL免费证书_Linux下Ce
- c++怎么使用std::tuple存储多元组数据_
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11如何更改用户账户文件夹名称 Win11修
- 如何在Golang中编写端到端测试_Golang
- Python 模块的 __name__ 属性如何由
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win11怎样彻底卸载自带应用_Win11彻底卸载
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- Python解释执行模型_字节码流程说明【指导】
- 如何用列表一次性对 DataFrame 的指定列应
- Win11怎样激活系统密钥_Win11系统密钥激活
- Win10如何卸载自带Edge_Win10彻底卸载
- Windows如何使用注册表查找和删除项?(reg
- Win10如何更改用户账户控制_Windows10
- 如何使用Golang table-driven基准
- Python网页解析流程_html结构说明【指导】
- c++中如何使用auto关键字_c++11类型推导
- 如何在Golang中使用内置函数_Golangle
- php查询数据怎么导出csv_查询结果转csv文件
- 如何使用Golang实现RPC序列化与反序列化_G
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11怎么设置快速访问_Windows11文件
- php接口返回数据乱码怎么办_php接口调试编码问
- Win11任务栏怎么放到顶部_Win11修改任务栏
- 如何在 ACF 中正确更新嵌套多层的 Group

QQ客服