c++20的std::is_constant_evaluated()有什么用? (编译期/运行时分支)
发布时间 - 2026-01-11 00:00:00 点击率:次std::is_constant_evaluated() 是 C++20 引入的用于区分编译期与运行时求值的工具,仅在 constexpr 函数中合法使用,返回 true 表示当前调用正被常量求值,否则为 false,支持同一函数内按求值时机分支实现轻量编译期逻辑与完整运行时逻辑。
std::is_constant_evaluated() 用来区分编译期求值和运行时求值
它返回 true 当前上下文正在常量求值(即在 constexpr 函数中被编译器当作常量表达式求值),否则返回 false。这是 C++20 引入的唯一标准方式,让同一段代码能根据求值时机自动切换行为,避免写两套逻辑(比如一个 constexpr 版本 + 一个普通函数版本)。
必须用在 constexpr 函数里才可能生效
单独调用 std::is_constant_evaluated() 在非 constexpr 上下文中是非法的(编译错误)。它的设计初衷就是配合 constexpr 函数,在编译期分支出轻量逻辑(如查表、递归展开),在运行时分支出完整逻辑(如动态内存分配、系统调用、异常处理)。
- ✅ 正确:定义为
constexpr函数,内部用if (std::is_constant_evaluated()) { ... } - ❌ 错误:在普通函数里调用,或在
constexpr函数外直接写std::is_constant_evaluated() - ⚠️ 注意:即使函数是
constexpr,如果实际调用时参数不是字面量或不可达常量表达式,仍会走运行时分支
典型使用场景:避免 constexpr 函数里做非法操作
比如想实现一个“尽量编译期算好,不行就运行时 fallback”的字符串哈希。编译期不能用 new、不能抛异常、不能读全局变量——但运行时可以。这时候就得靠 std::is_constant_evaluated() 拦住非法操作。
constexpr uint32_t hash(const char* s) {
if (std::is_constant_evaluated()) {
// 编译期:只用循环 + 基本算术
uint32_t h = 0;
for (int i = 0; s[i]; ++i) {
h = h * 31 + s[i];
}
return h;
} else {
// 运行时:可用 std::string、std::hash 等
return std::hash{}(s);
}
} - 编译期调用
hash("abc")→ 走 if 分支,成功生成常量表达式 - 运行时调用
hash(p)(p是运行时指针)→ 走 else 分支,不触发 constexpr 限制 - 别试图在 if 分支里写
std::vector或throw,那会导致整个函数无法用于常量表达式
容易踩的坑:它不等于“当前是否在 consteval 函数中”
std::is_constant_evaluated() 只反映“这次调用是否正被编译器当作常量表达式求值”,和函数声明无关。即使函数是 consteval,它也返回 true;但更关键的是:它在 constexpr 函数中可能返回 false(比如参数非常量)。
立即学习“C++免费学习笔记(深入)”;
- ❌ 误以为
consteval函数里调用它一定为true—— 实际上consteval函数根本不能有运行时路径,压根不该也不需要它 - ❌ 在模板元编程中误用:它对类型推导、SFINAE 无影响,只作用于求值时机
- ⚠️ 编译器差异:GCC 10+、Clang 11+、MSVC 19.28+ 支持良好;旧版本可能不支持或行为不一致
实际写的时候,最常被忽略的一点是:它不改变函数签名,也不参与重载决议——你得自己确保两个分支都语法合法、且各自满足其所处上下文的约束。否则一个分支编译失败,整个函数就废了。
# 工具
# c++
# 编译错误
# 常量
# if
# throw
# 全局变量
# 字符串
# 递归
# 指针
# 求值
# 也不
# 它不
# 的是
# 这是
# 非法操作
# 能有
# 可达
# 就得
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
在线教育网站制作平台,山西立德教育官网?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Python面向对象测试方法_mock解析【教程】
EditPlus中的正则表达式 实战(2)
北京网站制作公司哪家好一点,北京租房网站有哪些?
浅谈javascript alert和confirm的美化
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何使用Telescope进行调试?(安装和使用教程)
如何快速打造个性化非模板自助建站?
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
如何在自有机房高效搭建专业网站?
香港服务器部署网站为何提示未备案?
iOS中将个别页面强制横屏其他页面竖屏
移动端脚本框架Hammer.js
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何快速搭建支持数据库操作的智能建站平台?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
如何用IIS7快速搭建并优化网站站点?
如何批量查询域名的建站时间记录?
Laravel如何使用Sanctum进行API认证?(SPA实战)
如何正确选择百度移动适配建站域名?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
网站制作免费,什么网站能看正片电影?
Laravel如何实现用户注册和登录?(Auth脚手架指南)
QQ浏览器网页版登录入口 个人中心在线进入
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel如何实现API版本控制_Laravel版本化API设计方案
中国移动官方网站首页入口 中国移动官网网页登录
如何在橙子建站上传落地页?操作指南详解
免费网站制作appp,免费制作app哪个平台好?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
如何在Windows服务器上快速搭建网站?
如何快速搭建安全的FTP站点?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
Android仿QQ列表左滑删除操作
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
网站优化排名时,需要考虑哪些问题呢?
网站建设保证美观性,需要考虑的几点问题!
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
网站图片在线制作软件,怎么在图片上做链接?
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】


辑与完整运行时逻辑。