折叠表达式是否会短路?
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 关于是否折叠的头疼-发生短路...
如果你无法避免写 and
和 or
折叠,至少要慷慨地评论短路行为。
在 C++17 中,当与 &&
或 ||
作为运算符一起使用时,折叠表达式是否服从 short-circuiting?如果是这样,这是在哪里指定的?
是的,使用 &&
或 ||
作为运算符的折叠表达式可能会短路,但通常需要注意的是,它发生在内置含义中,但不会出现在重载运算符中功能。
折叠表达式的含义在 [temp.variadic]/9:
中定义The instantiation of a fold-expression produces:
((E_1
opE_2)
op ...)
opE_N
for a unary left fold,
E_1
op(
... op(E_N_minus_1
opE_N))
for a unary right fold,
(((E
opE_1)
opE_2)
op ...)
opE_N
for a binary left fold, and
E_1
op(
... op(E_N_minus_1
op(E_N
opE)))
for a binary right fold.In each case, op is the fold-operator,....
由于折叠表达式的实例化是根据包含运算符的表达式,运算符的所有常规规则,包括重载决策、计算顺序和内置运算符时的短路,申请。
而@aschepler 的
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 关于是否折叠的头疼-发生短路...
如果你无法避免写 and
和 or
折叠,至少要慷慨地评论短路行为。