constexpr常量表达式

constexpr常量表达式

constexprC++11 引入的一个很重要的关键字。它最核心的意义可以概括成一句话:让某些值或函数有机会在编译期完成计算。

1. 为什么它常用?

在早期 C++ 里,常量通常这样写:

1
const int size = 10;

const 不等于“编译期常量表达式”。
constexpr 更强调的是:这个值在语义上就是一个编译期可求值的常量。

2. constexpr变量

1
constexpr int size = 10;

这种变量通常可以直接用于需要编译期常量的地方,例如数组大小、模板参数等。

3. constexpr函数

3.1 基本示例

1
2
3
4
constexpr int square(int x)
{
return x * x;
}

使用:

1
constexpr int ret = square(5);

这里 ret 可以在编译阶段直接得到结果。

4. 一个完整例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

constexpr int add(int a, int b)
{
return a + b;
}

int main()
{
constexpr int value = add(3, 4);
cout << value << endl;
return 0;
}

5. constexpr 和 const 的区别

const

  • 表示只读
  • 不一定是编译期常量

constexpr

  • 表示可以在编译期求值
  • 隐含 const 属性

所以二者有交集,但不是一个概念。

6. 使用时的限制

C++11 里,constexpr 函数限制比后续标准更严格,一般要求:

  • 函数体尽量简单
  • 返回值明确
  • 不做复杂运行时操作

所以如果你看到一些更灵活的 constexpr 写法,那通常是后续标准进一步放宽后的结果。

7. 常见使用场景

7.1 编译期常量

1
constexpr int MaxSize = 1024;

7.2 简单数学计算

1
2
3
4
constexpr int area(int w, int h)
{
return w * h;
}

7.3 配合 static_assert

1
static_assert(square(4) == 16, "error");

总结

constexpr 是现代 C++ 非常基础的一块能力。
它让“只读”进一步进化成了“编译期可求值”,这在常量定义、模板、静态检查里都很有用。对于 C++11 来说,这已经是往编译期计算迈出的很关键一步了。