C++1z 将引入“constexpr if”——一个 if 将根据条件删除其中一个分支。似乎合理且有用。
但是,没有 constexpr 关键字就不可能吗?我认为在编译期间,编译器应该知道在编译期间是否知道条件。如果是,即使是最基本的优化级别也应该删除不必要的分支。
例如(参见 Godbolt:https ://godbolt.org/g/IpY5y5 ):
int test() {
const bool condition = true;
if (condition) {
return 0;
} else {
// optimized out even without "constexpr if"
return 1;
}
}
Godbolt explorer 显示,即使带有 -O0 的 gcc-4.4.7 也没有编译“return 1”,所以它实现了 constexpr if 所承诺的。显然,当条件是 constexpr 函数的结果时,这样的旧编译器将无法这样做,但事实仍然存在:现代编译器知道条件是否是 constexpr,并且不需要我明确地告诉它。
所以问题是:
为什么“constexpr if”中需要“constexpr”?