我们知道,当 constexpr 函数
的返回值在编译时
未知时,它会延迟到运行时计算
(IOW,衰减到非constexpr 函数
)。这使我们可以自由地将 constexpr
附加到函数中,而不必担心任何开销。
我认为它也可以应用于if 语句
。从 c++17 开始,我们有了 if constexpr
,所以我们可以很容易地使用 compile-time if statement
(没有 true_type
/false_type
。然而,与 constexpr 函数
不同的是,如果在编译时无法知道其条件,它将失败:
constexpr int factorial(int n)
{
if constexpr(n == 0) return 1;
else return n * factorial(n-1);
}
所以,上面的代码cannot pass compilation因为 n
不是常量表达式。但可以肯定的是,the function can be calculated at compile-time
when input is known at compile-time .
最佳答案
出于同样的原因,吞下错误/异常并努力通过是不好的。它可能会使您的程序处于某种未指定的状态。几乎不可能进行推理。
如果程序中的约束没有得到满足,编写它并依赖它的人需要被及时通知。让这样的事情成为语言结构的硬错误是有道理的。尤其是在语言结构驱动实际代码生成的情况下。
在这种情况下,约束条件是 b
是一个有效的常量表达式。
关于c++ - 从语言设计层面来看,为什么在编译时无法推导出条件时, "if constexpr"不会衰减为 "trival if",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50926963/