讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中constexpr是什么意思_c++常量表达式详解【核心】

阿强酱_2125

阿强酱_2125

发布时间:2026-02-06 15:10:57

|

334人浏览过

|

来源于php中文网

原创

constexpr 是 C++ 中要求在编译期求值的关键字,用于变量、函数或对象;它强制参与常量表达式计算,否则编译失败,而 const 仅保证运行时不可修改。

c++中constexpr是什么意思_c++常量表达式详解【核心】

constexpr 是 C++ 中用于声明「在编译期就能求值」的变量、函数或对象的关键词。它不是简单的“只读标记”,而是向编译器发出明确指令:这个东西必须能参与常量表达式计算——否则就是编译错误。

什么时候必须用 constexpr 而不能用 const

const 只表示运行时不可修改,constexpr 则要求值在编译期确定。以下场景会直接报错(如 GCC/Clang 提示 error: constexpr variable 'x' must be initialized by a constant expression):

  • 作为数组长度:int arr[constexpr_size]; —— 若 constexpr_size 只是 const int 但初始化依赖运行时值(如 cin >> x; const int n = x;),就不合法
  • 非类型模板参数:std::array<int n> a;</int> 要求 N 是 constexpr 整型
  • case 标签值:switch (v) { case kValue: ... } 中 kValue 必须是 constexpr
  • 静态断言:static_assert(condition, "..."); 的 condition 必须是 constexpr 布尔表达式

constexpr 函数的限制与放宽(C++11 → C++20)

早期 C++11 对 constexpr 函数极其严格:只能包含一个 return 语句,不能有循环、局部变量、分支(if)、异常等。C++14 开始大幅放宽,C++20 允许更多运行时特征(但仍需满足“所有调用路径都能在编译期求值”):

Model Switcher
Model Switcher

根据任务复杂度自动切换不同的AI模型。支持OpenClaw设置中的所有可用模型。当检测到复杂...

下载
  • C++14 起支持多条语句、if/switch、局部变量、for/while 循环(只要循环次数可静态推导)
  • 函数体仍不能含 new/delete、try/catch、asm 等无法在编译期执行的操作
  • 若函数被用于需要常量表达式的上下文(如模板参数),则本次调用必须能被编译器静态求值;否则即使函数声明为 constexpr,也会退化为普通运行时函数
  • 示例:constexpr int square(int x) { return x * x; } 在 int a[square(5)]; 中有效,在 int b[square(n)];(n 是运行时变量)中无效,但不会导致编译失败(只是不参与常量表达式)

常见误用与陷阱

看似写了 constexpr,实际并未达成编译期求值,甚至引发未定义行为:

立即学习“C++免费学习笔记(深入)”;

  • 对非字面类型(non-literal type)使用 constexpr:例如含虚函数、用户自定义构造函数且未标记 constexpr 的类,无法声明为 constexpr 对象
  • 引用或指针指向运行时地址:constexpr const int* p = &x; 合法仅当 x 是 constexpr 变量且生命周期延伸到常量表达式求值期间;否则报错
  • 调用未定义行为的 constexpr 函数(如除零、越界访问):C++14 起这类函数在常量表达式中调用会直接导致编译失败(SFINAE 或硬错误),而非静默忽略
  • 忽略隐式转换:比如 constexpr double d = 3.14; 不能用于需要整型常量表达式的地方(如数组大小),即使数值上是整数

最易被忽略的一点:一个 constexpr 函数是否真正在编译期执行,完全取决于**调用上下文**,而不是函数声明本身。编译器不会为你“尽力优化”,它只按标准判断能否静态求值——写错了,就报错;写对了,但用在运行时变量上,它就老老实实生成运行时代码。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1417

2024.03.13

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1009

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3100

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2278

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn