从语言设计层面来看,为什么在编译时无法推导出条件时 "if constexpr" 不会衰减到 "trival if"

From LANGUAGE DESIGN level, why doesn't "if constexpr" decay to "trival if" when condition cannot be deduced at compile-time

我们知道,当 constexpr function 的 return 值无法在 compile-time 获知时,它将延迟到 run-time 计算(IOW,衰减non-constexpr function)。这使我们可以自由地坚持 constexpr 一个功能,而不用担心任何开销。

我觉得也适用于if statement。从c++17开始,我们有if constexpr,所以我们可以很容易地使用compile-time if statement(没有true_type/false_type。不像constexpr function,但是,它会失败如果在编译时无法知道其条件:

constexpr int factorial(int n)
{
    if constexpr(n == 0) return 1;
    else return n * factorial(n-1);
}

所以,上面的代码 cannot pass compilation because n is not a constant expression. But certainly, the function can be calculated at compile-time when input is known at compile-time

出于同样的原因,吞咽 errors/exceptions 并且仅仅通过犁地是不好的。它可能会使您的程序处于某种未指定的状态。几乎无法推理。

如果程序中的约束不满足,编写它并依赖它的人需要被及时通知。让这样的事情成为语言结构的硬错误是有道理的。特别是如果语言结构驱动实际的代码生成。

在这种情况下,约束是 b 作为一个有效的常量表达式。