折叠表达式会短路吗?

Are fold expressions subject to short-circuiting?

本文关键字:短路 表达式 折叠      更新时间:2023-10-16

在 C++17 中,折叠表达式在与&&||作为运算符一起使用时是否会短路?如果是这样,在哪里指定?

是的,使用&&||折叠表达式,因为运算符可能会短路,但通常需要注意的是,它发生在内置含义上,而不是重载运算符函数上。

折叠表达式的含义在 [temp.variadic]/9 中定义:

折叠表达式的实例化产生:

  • ((E_1opE_2)op ...)opE_N对于一元左折,

  • E_1op(...操作(E_N_minus_1opE_N))对于一元右折,

  • (((EopE_1)opE_2)op ...)二元左折的opE_N,以及

  • E_1op(...操作(E_N_minus_1op(E_NopE)))对于二进制右折。

在每种情况下,op都是折叠运算符,....

由于折叠表达式的实例化是包含运算符的表达式,因此运算符的所有正常规则(包括重载解析、计算顺序和内置运算符时的短路(都适用。

虽然@aschepler的答案是特别正确的,但我想重复我分享的关于另一个很好的技术点(元组破坏顺序(的人生教训:

如果你能为多个备选方案制定一个合理的论据,说明为什么该备选方案应该是标准规定的替代方案——那么你不应该假设其中任何一个是强制性的(即使其中一个恰好是(。

在折叠表达式和短路逻辑的上下文中 - 阅读可变参数模板化代码已经足够困难了,所以我会尝试为我的代码的读者省去关于折叠短路是否发生的令人头疼的问题......

如果你不能避免写andor的折叠,至少要慷慨地评论短路行为。