当年大家第一次看到 constexpr。
都挺兴奋。
“我可以把计算搬到编译期。”
然后写着写着。
就撞墙了。
当年:constexpr 像个“乖孩子”
早期的 constexpr。
限制很多。
函数体不能太复杂。
不让你随便写循环。
不让你随便改变量。
你想写点像样的逻辑。
就很别扭。
线上啪一下:表没算出来,结果跑到了运行时
你写了个小项目。
想做一个查表。
比如把字符映射成类别。
你希望它在编译期生成。
这样运行时就只是查数组。
但你发现。
你写出来的代码。
不小心就退化成运行时了。
你也不一定看得出来。
C++20:constexpr 变得更像“能写正常代码”
一个直观的感受是。
你可以在 constexpr 里更自然地用循环。
#include <array>
constexpr int sum_1_to(int n) {
int s = 0;
for (int i = 1; i <= n; ++i) s += i;
return s;
}
static_assert(sum_1_to(10) == 55);
这段代码。
你用 C 的眼光看。
就是普通函数。
区别只是。
它允许在编译期执行。
你会用到的一个场景:编译期生成表
#include <array>
constexpr std::array<int, 4> make_table() {
std::array<int, 4> a{};
for (int i = 0; i < 4; ++i) a[i] = i * i;
return a;
}
constexpr auto table = make_table();
你得到一个编译期的 table。
运行时不需要再算。
关键结论
constexpr 的升级。
让“编译期”更像一个正常的执行环境。
小结
别把 constexpr 当黑魔法。
把它当成。
“这段代码有机会在编译期跑”。
有机会。
就足够值钱了。