3

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

我认为它也可以适用于if statement. 从 c++17 开始,我们有了if constexpr,所以我们可以compile-time if statement很容易地使用(没有true_type/ false_typeconstexpr function但是,与 不同的是,如果在编译时无法知道其条件,它将失败:

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

所以,上面的代码不能通过编译,因为n不是常量表达式。但可以肯定的是,可以在 compile-time 知道输入时计算该函数compile-time

4

1 回答 1

1

出于同样的原因,吞下错误/异常并仅仅通过是不好的。它可能会使您的程序处于某种未指定的状态。几乎无法推理。

如果程序中的约束未得到满足,则需要立即通知编写并依赖它的人。使这样的事情成为语言构造的硬错误是有道理的。特别是如果语言结构驱动代码的实际生成。

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

于 2018-06-19T11:12:45.310 回答