C++ 中的 constexpr与 const区

一、一句话总览

const:运行期只读

constexpr:编译期常量 + 运行期也可用

关键字 核心语义

const 承诺"我不会修改它"

constexpr 承诺"它在编译期就能算出来"

二、核心区别详解

1️⃣ 求值时机不同(最关键)

✅ const

int x = 10;

const int a = x; // ✅ 合法

• a 的值在运行期确定

• 只要初始化完成,之后不能再改

👉 不要求是编译期常量

✅ constexpr

constexpr int a = 10; // ✅

constexpr int b = x; // ❌ x 不是编译期常量

• 必须在编译期可求值

• 编译器会在编译阶段计算

✅ 可用作:

• 数组大小

• 模板参数

• switch case

• 位宽等

constexpr int N = 10;

int arrN; // ✅

2️⃣ 对函数和表达式的支持

✅ constexpr 函数

constexpr int square(int x) {

return x * x;

}

constexpr int y = square(5); // 编译期计算

• 若参数是编译期常量 → 编译期求值

• 否则 → 运行期函数

int x = 3;

int z = square(x); // 运行期调用

📌 constexpr ≠ 只能编译期执行

❌ const 不能修饰函数返回值表示"常量表达式"

const int f(); // 只是返回值不可修改

3️⃣ 修饰指针时的差异

const

const int* p; // 指向的内容不可改

constexpr

constexpr int x = 10;

constexpr const int* p = &x; // ✅

📌 constexpr 指针:

• 指针本身是常量

• 指向的对象也必须是编译期常量

4️⃣ 与 static_assert / 模板参数的关系

constexpr int N = 5;

static_assert(N == 5, "error");

template

struct A {};

A a; // ✅

❌ const 做不到

三、C++11 之后的演进

C++11

• constexpr 函数只能有一个 return

• 只能用于字面量类型

C++14

• 允许局部变量

• 允许循环、条件语句

constexpr int sum(int n) {

int s = 0;

for (int i = 1; i <= n; ++i)

s += i;

return s;

}

C++20

• 放宽更多限制

• 允许虚函数、try-catch

四、典型对比示例

场景 const constexpr

数组大小 ❌ ✅

switch case ❌ ✅

模板参数 ❌ ✅

运行期变量 ✅ ✅

防止误修改 ✅ ✅

五、什么时候用哪个?

✅ 用 const

• 只想防止误修改

• 值在运行期才确定

• 函数参数、成员函数

void foo(const std::string& s);

✅ 用 constexpr

• 需要编译期常量

• 性能敏感(零运行时开销)

• 泛型 / 模板 / 元编程

constexpr double PI = 3.1415926;

六、一句话总结(面试版)

const 强调"不可修改",constexpr 强调"能在编译期算出来"。

所有 constexpr 都是 const,但不是所有 const 都是 constexpr。

相关推荐
奋斗的阿狸_19864 小时前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
夜之眷属4 小时前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
weixin199701080164 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存
波加曼大王4 小时前
# vLLM不要迷信PagedAttention神话,聊聊线上藏着的内部碎片陷阱
java·架构
SL_staff4 小时前
目标健康度自检清单:开发者视角下的目标-计划-任务链路断点诊断
java·开源·github
for_ever_love__4 小时前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结
神仙别闹4 小时前
基于C++实现的贪吃蛇游戏平台
java·c++·游戏
ACP广源盛139246256734 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
布吉岛的石头4 小时前
Java 程序员第 49 阶段11:Java 接 BERT:用 ONNX Runtime 做句向量推理
java·人工智能·python·深度学习·bert·transformer
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——JAVA服务端
java·开发语言