gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:55:36 25 4
gpt4 key购买 nike

我们知道,当 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com