三亩地.
  • 首页
  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验
  • 实战教程
  • 编程思维
  • 资讯中心
  • 关于我们

资讯详情

深入了解每一个知识点

  • 首页
  • /
  • 资讯中心
  • /
  • 文章详情

三、constexpr

📅 2026/7/29 20:18:05 👁️ 阅读次数 📝 编程学习
三、constexpr

三、constexpr

1. const 的局限性

const 修饰变量代表这个变量不能被修改,但它不一定是编译期常量,也就是说它不能区分编译期常量和运行期常量,它的值完全可以运行时才确定。

#include <iostream>
int get_runtime_val()
{return 666;
}
int main()
{const int c1 = 10;const int c2 = get_runtime_val();return 0;
}
  • c1是字面量初始化,编译器可以识别为常亮,只读,允许运行时初始化。
  • c2是运行调用get_runtime_val()得到,仅仅是运行时只读变量,不能用做数组大小、模板参数。

const修饰只读,运行时可以初始化;constexpr修饰编译期可求值,要求编译期阶段就能算出来。

2. constexpr修饰变量(c++11)

被constexpr修饰的变量,必须编译期就能得到结果。
其语法格式:
constexpr 类型 变量名 = 常量表达式;

constexpr int A = 20;
constexpr int B = A * 3 + 5;
int arr[A];          // 标准C++允许,编译期常量
int arr2[B];         // 
// constexpr int C = get_num(); // 报错,get_num运行时调用,不是常量表达式
  • constexpr变量初始化表达式,必须是常量表达式
  • 不允许运行时函数返回初始化
  • constexpr变量隐式带上const属性,不能修改
    image

3. constexpr 修饰函数(C++11 ~ C++17 变化)

C++11 constexpr 函数限制非常严格

  • 函数里面只能有一条 return 语句;
  • 不能有局部变量;
  • 不能循环、if;
  • 参数、返回值必须是字面值类型;
// C++11合法constexpr函数
constexpr int calc(int x)
{return x * x + 2;
}
int main()
{constexpr int res = calc(10); // 编译期计算 res = 102int arr[res];                 // 数组大小int a = 5;int res2 = calc(a);          // 也可以运行时调用,普通函数使用return 0;
}

constexpr 函数有双重能力:

  • 如果传入常量表达式实参,则在编译期计算;
  • 如果传入普通运行时变量,退化成普通函数,运行时执行。

C++14 放松 constexpr 函数限制

C++14:constexpr 函数允许局部变量、循环、if 分支,函数体内可以有多条语句。

// C++14 可以写循环
constexpr int factorial(int n)
{int ret = 1;for(int i = 2; i <= n; ++i){ret *= i;}return ret;
}
int main()
{constexpr int f5 = factorial(5); // 编译期算出120return 0;
}

C++17:constexpr if(编译期分支)

template<typename T>
void func(T t)
{if constexpr(sizeof(T) == 4){// 仅int等4字节类型编译这一段代码}else{// 其他类型编译这一段}
}

4. constexpr 修饰构造函数(常量表达式对象)

C++11 允许constexpr构造函数,可以在编译期构造对象。
要求:构造函数体内不能有复杂逻辑,成员全部常量初始化。

struct Point
{int x;int y;// constexpr构造函数constexpr Point(int a, int b) : x(a), y(b){}
};
int main()
{// 编译期就构造完成对象,不占用运行时constexpr Point p{10,20};static_assert(p.x == 10, "error"); //编译期断言,条件不满足直接编译报错,运行时无开销。return 0;
}

5. constexpr 与 const 总结

特性 const constexpr
主要作用 只读保护 编译期求值
变量初始化 可以运行时初始化 必须常量表达式
修饰函数 不能修饰函数(C++ 前) C++11 起支持编译期函数
数组大小 不一定可用 可以做编译期数组大小
对象 可以修饰运行时对象 可以编译期构造对象
是否隐式带 const 是 是
编程学习 技术分享 实战经验

相关新闻

5分钟上手BeeRef:创作者必备的参考图管理神器

2026/7/29 20:18:05

如何高效使用Java代码分析工具:专业级反混淆完整指南

2026/7/29 20:18:05

终极指南:3分钟掌握Steam游戏数据提取的完整方法

2026/7/29 20:16:50

最新新闻

douyin-downloader:抖音内容批量下载与管理的完整解决方案

2026/7/29 21:26:10

宝鸡黄金回收避坑指南!全域区县实体门店,免费上门、实价实收不压价 - 淘淇黄金回收

2026/7/29 21:26:10

南昌团队聚餐火锅推荐|多场景适配本地火锅觅食指南 - 品牌2026推荐

2026/7/29 21:26:10

罗技鼠标宏终极指南:5分钟搞定PUBG完美压枪

2026/7/29 21:25:51

暗黑破坏神2存档编辑器d2s-editor:可视化修改工具全面解析与实战指南

2026/7/29 21:26:10

NIKON 4S020-140 印刷电路板

2026/7/29 21:26:10

日新闻

I.Ming 8.10字体发布:300+字符扩展与多语言排版技术架构深度解析

2026/7/29 0:00:06

QT C++调用Python异常处理:PyBind11实战与跨语言编程指南

2026/7/29 0:01:51

金融舆情监测系统:多语言情感分析与实时可视化技术解析

2026/7/29 0:01:51

周新闻

数字身份克隆技术:Second Me开源项目解析与应用

2026/7/29 18:14:08

仅限本周开放|GMAT AI备考效能评估工具(含ETS官方题库行为轨迹比对模块),免费生成专属「提分热力图」与瓶颈突破路线图

2026/7/29 7:27:08

技术焦虑下的业务聚焦:构建可持续的技术竞争力

2026/7/28 12:52:55

月新闻

[C++]内存管理:串顺序存储的内存回收

2026/7/29 2:35:36

足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建

2026/7/28 10:22:11

抖音内容监控助手:告别手动刷新,让优质内容主动找你

2026/7/28 9:53:16

分类目录

  • 学习日记
  • 项目实战
  • 学习方法
  • 代码技巧
  • 避坑指南
  • 调试经验

热门标签

JavaScript Python Java 前端开发 后端开发 算法 数据结构 项目实战

关于三亩地

三亩地是一个专注于编程学习的平台,以真实学习日记为载体,分享编程学习经验、项目实操技巧和高效学习方法。

快速链接

学习日记

项目实战

学习方法

资讯中心

联系方式

邮箱:contact@mfbz.cn

微信:sanmudi_code

QQ 群:123456789

© 2026 三亩地 编程学习日记 版权所有 | mfbz.cn