← 返回首页

常量表达式 constexpr

C++11 引入 constexpr 关键字,用于声明编译时常量表达式。

constexpr 与 const 的区别

使用 const 声明时,编译器隐式跟踪它是运行时常量还是编译时常量。constexpr 变量只能是编译时常量,如果初始化值不是常量表达式,编译器将报错。

最佳实践:

常量折叠(Constant Folding)

#include <iostream>

int main() {
    std::cout << 3 + 4 << '\n';
    return 0;
}

虽然完整表达式不是常量表达式,但子表达式 3+4 会在编译时优化。这种优化称为常量折叠

将变量设为 constexpr 可以确保它们符合常量折叠的条件。

constexpr 函数与变量

constexpr if 语句(C++17)

#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 确保编译时计算发生(即使禁用优化)。