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

标签 c++ constexpr if-constexpr

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

相关文章:

c++ - 遍历结构和类成员

c++ - 使用 constexpr 编译时出错

c++ - C++17 中的 "If constexpr"在非模板函数中不起作用

c++ - 如何在 constexpr 上下文中使用 if-constexpt 比较 string_view

c# - Unity,c++ native 插件不匹配的字节数组

c++ - 如何覆盖 C++ 标准库类函数?

c++ - 如何替换版本 g++5 的 bvector header

c++ - 对外部模板 constexpr 构造函数的 undefined reference

C++ 声明其大小值来自 const 数组的数组