从语言设计层面来看,当编译时无法推断条件时,为什么"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
的返回值不能在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);
}
因此,上面的代码无法通过编译,因为n
不是常量表达式。但可以肯定的是,当输入在编译时已知时,可以在compile-time
时计算该函数。
出于同样的原因,吞下错误/异常并只是耕耘是不好的。它可能会使您的程序处于某种未指定的状态。几乎无法推理。
如果不满足程序中的约束,则需要立即通知编写并依赖它的人。使这样的事情成为语言结构的硬错误是有道理的。特别是如果语言结构驱动代码的实际生成。
在这种情况下,约束b
为有效的常量表达式。
相关文章:
- 将按位if条件转换为普通if条件
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么这个if(s[j]==s[i] && i>0)条件不适用于这个[{()}]
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 当我的 if 条件计算结果为 false 时,我的 else 块将不会执行
- 使用枚举作为条件,if 条件将返回什么,真或假?
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- 使用 if 条件对数字进行分组
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 将子字符串与字符串数组进行比较的 IF 条件会在C++中产生错误
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 带有逻辑 OR 运算符的 if 条件的缩写?
- 为什么我可以将 ifstream 文件置于 if 条件?
- 如何将特征张量的值作为'if'条件表达式
- 在 c++ 中检查 if 条件中的向量位置范围
- 如何在Char数组中搜索Char在IF条件语句中
- 未正确评估'If'条件