0

0

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

尼克

尼克

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

|

274人浏览过

|

来源于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 a; 要求 Nconstexpr 整型
  • 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 允许更多运行时特征(但仍需满足“所有调用路径都能在编译期求值”):

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

常见误用与陷阱

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

ThinkAny
ThinkAny

一个RAG驱动的AI搜索引擎,由独立开发者idoubi开发

下载

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1511

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

795

2023.08.22

switch语句用法
switch语句用法

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

545

2023.09.21

Java switch的用法
Java switch的用法

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

427

2024.03.13

while的用法
while的用法

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

98

2023.09.25

scripterror怎么解决
scripterror怎么解决

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

309

2023.10.18

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

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

317

2023.10.25

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

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

537

2023.09.20

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

49

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8.7万人学习

C 教程
C 教程

共75课时 | 4.5万人学习

C++教程
C++教程

共115课时 | 16.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号