constexpr常量表达式

constexpr常量表达式
枫constexpr常量表达式
constexpr是 C++11 引入的一个很重要的关键字。它最核心的意义可以概括成一句话:让某些值或函数有机会在编译期完成计算。
1. 为什么它常用?
在早期 C++ 里,常量通常这样写:
1 | const int size = 10; |
但 const 不等于“编译期常量表达式”。
而 constexpr 更强调的是:这个值在语义上就是一个编译期可求值的常量。
2. constexpr变量
1 | constexpr int size = 10; |
这种变量通常可以直接用于需要编译期常量的地方,例如数组大小、模板参数等。
3. constexpr函数
3.1 基本示例
1 | constexpr int square(int x) |
使用:
1 | constexpr int ret = square(5); |
这里 ret 可以在编译阶段直接得到结果。
4. 一个完整例子
1 |
|
5. constexpr 和 const 的区别
const
- 表示只读
- 不一定是编译期常量
constexpr
- 表示可以在编译期求值
- 隐含 const 属性
所以二者有交集,但不是一个概念。
6. 使用时的限制
在 C++11 里,constexpr 函数限制比后续标准更严格,一般要求:
- 函数体尽量简单
- 返回值明确
- 不做复杂运行时操作
所以如果你看到一些更灵活的 constexpr 写法,那通常是后续标准进一步放宽后的结果。
7. 常见使用场景
7.1 编译期常量
1 | constexpr int MaxSize = 1024; |
7.2 简单数学计算
1 | constexpr int area(int w, int h) |
7.3 配合 static_assert
1 | static_assert(square(4) == 16, "error"); |
总结
constexpr 是现代 C++ 非常基础的一块能力。
它让“只读”进一步进化成了“编译期可求值”,这在常量定义、模板、静态检查里都很有用。对于 C++11 来说,这已经是往编译期计算迈出的很关键一步了。














