折叠表达式是否会短路?

Are fold expressions subject to short-circuiting?

在 C++17 中,当与 &&|| 作为运算符一起使用时,折叠表达式是否服从 short-circuiting?如果是这样,这是在哪里指定的?

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

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

中定义

The instantiation of a fold-expression produces:

  • ((E_1 op E_2) op ...) op E_N for a unary left fold,

  • E_1 op (... op (E_N_minus_1 op E_N)) for a unary right fold,

  • (((E op E_1) op E_2) op ...) op E_N for a binary left fold, and

  • E_1 op (... op (E_N_minus_1 op (E_N op E))) for a binary right fold.

In each case, op is the fold-operator,....

由于折叠表达式的实例化是根据包含运算符的表达式,运算符的所有常规规则,包括重载决策、计算顺序和内置运算符时的短路,申请。

而@aschepler 的 is the specifically-correct one, I'd like to repeat a life-lesson I've :

If you can formulate, for multiple alternatives, a reasonable argument for why that alternative should be the one mandated by the standard - then you should not assume any of them is mandated (even if one of them happens to be).

在折叠表达式和短路逻辑的上下文中 - 阅读可变参数模板代码已经很困难了,所以我会尝试保存我的代码的 reader 关于是否折叠的头疼-发生短路...

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