C++11 引入 constexpr 关键字,用于声明编译时常量表达式。
使用 const 声明时,编译器隐式跟踪它是运行时常量还是编译时常量。constexpr 变量只能是编译时常量,如果初始化值不是常量表达式,编译器将报错。
最佳实践:
constexprconst#include <iostream>
int main() {
std::cout << 3 + 4 << '\n';
return 0;
}
虽然完整表达式不是常量表达式,但子表达式 3+4 会在编译时优化。这种优化称为常量折叠。
将变量设为 constexpr 可以确保它们符合常量折叠的条件。
std::string_view#include <iostream>
int main() {
constexpr double gravity{ 9.8 };
if constexpr (gravity == 9.8)
std::cout << "Gravity is normal.\n";
else
std::cout << "We are not on Earth.\n";
return 0;
}
编译时条件表达式被评估,结果为 true 时只有 true 分支被保留。上述代码编译后等价于:
int main() {
std::cout << "Gravity is normal.\n";
return 0;
}
使用 constexpr if 确保编译时计算发生(即使禁用优化)。