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; ?>
】
相关推荐
- windows 10专注助手怎么关闭_window
- 网站内页做seo排名怎么做?
- Win10如何设置双wan路由器 Win10双wa
- php在Linux怎么部署_LNMP环境搭建PHP
- 如何在Golang中捕获JSON序列化错误_Gol
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- 如何快速验证Golang安装是否成功_运行go v
- php条件判断怎么写_ifelse和switchc
- 如何使用Golang defer优化性能_减少不必
- Win11怎么设置快速访问主页_Windows11
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- 如何使用Golang捕获并记录协程panic_保证
- Win10怎样清理C盘Steam游戏缓存_Win1
- php怎么下载安装后设置错误日志_phpini l
- 如何解决Windows时间不准的问题?(自动同步设
- Windows如何拦截腾讯视频广告_Windows
- php文件怎么变mp4保存_php输出视频流保存为
- 如何使用Golang实现容器安全扫描_Golang
- c++怎么使用std::tuple存储多元组数据_
- Win11怎么更改鼠标指针_Windows 11自
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- Windows 11登录时提示“用户配置文件服务登
- php中$this和::能混用吗_对象与静态作用域
- C++如何获取CPU核心数?(std::threa
- Win11视频默认播放器怎么改_Win11关联第三
- C#如何在一个XML文件中查找并替换文本内容
- Mac如何解压zip和rar文件?(推荐免费工具)
- Win11任务栏怎么调到左边_Win11开始菜单居
- MAC怎么截图并快速编辑_MAC自带截图快捷键与标
- php查询数据怎么导出csv_查询结果转csv文件
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Python面向对象实战讲解_类与设计模式深入理解
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Win11怎么设置快速访问_Windows11文件
- 如何使用Golang管理模块版本_Golanggo
- win11 OneDrive怎么彻底关闭 Win1
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win10怎么关闭自动更新错误重启 Win10策略
- php和redis连接超时怎么办_phpredis
- TestNG的testng.xml配置文件怎么写
- c# Task.Yield 的作用是什么 它和Ta
- Python深度学习实战教程_神经网络模型构建与训
- Win11怎么关闭自动调节亮度 Win11禁用内容
- php8.4xdebug无法调试怎么办_php8.
- Win11怎么忘记WiFi网络_Win11删除已保
- Win11怎么查看激活状态_查询Windows 1
- Windows10如何查看保存的WiFi密码_Wi
- 如何正确访问 Laravel 模型或对象的属性而非
- Win10怎样设置多显示器_Win10多显示器扩展

QQ客服