从语言设计层面来看,为什么在编译时无法推导出条件时 "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
作为一个有效的常量表达式。
我们知道,当 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
作为一个有效的常量表达式。