在C ++ 17中,当&&
或||
作为运算符使用时,折叠表达式是否为short-circuiting?如果是,那么这个指定在哪里?
答案 0 :(得分:6)
是的,使用&&
或||
折叠表达式,因为操作符可以短路,但通常需要注意的是内置意义,而不是重载的运算符函数。
fold-expression的含义在[temp.variadic] / 9:
中定义fold-expression 的实例化产生:
((E_1
opE_2)
op ...)
op {{ 1}}用于一元左折,
E_N
opE_1
... op(
op {{ 1}}为一元右折,
(E_N_minus_1
opE_N))
op(((E
op ... {{ 1}} opE_1)
表示二进制左折,
E_2)
op)
... opE_N
op {{ 1}} opE_1
用于二进制右折叠。在每种情况下, op 是 fold-operator ,....
由于fold-expression的实例化是根据包含运算符的表达式进行的,因此运算符的所有常规规则,包括重载分辨率,评估顺序和内置运算符时的短路都适用。
答案 1 :(得分:-1)
虽然@ aschepler' s answer是特别正确的,但我想重复我的生活课程shared regarding another fine technical point (tuple order of destruction):
如果您可以为多种替代方案制定一个合理的论据,说明为什么该替代方案应该是标准规定的方案 - 那么您不应该假设它们中的任何一个是强制性的(即使其中一个恰好是)。< / p>
在折叠表达式和短路逻辑的背景下 - 它已经足够难以读取可变参数模板化代码,所以我试着保存我的代码的读者,关于是否折叠 - 短路发生...
如果你不能写and
和or
折叠,至少要对短路行为的评论慷慨。