折叠表达式是否会短路?

时间:2018-05-01 04:15:18

标签: c++ c++17 fold short-circuiting

在C ++ 17中,当&&||作为运算符使用时,折叠表达式是否为short-circuiting?如果是,那么这个指定在哪里?

2 个答案:

答案 0 :(得分:6)

是的,使用&&||折叠表达式,因为操作符可以短路,但通常需要注意的是内置意义,而不是重载的运算符函数。

fold-expression的含义在[temp.variadic] / 9:

中定义
  

fold-expression 的实例化产生:

     
      
  • ((E_1 op E_2) op ... ) op {{ 1}}用于一元左折,

  •   
  • E_N op E_1 ... op ( op {{ 1}}为一元右折,

  •   
  • (E_N_minus_1 op E_N)) op (((E op ... {{ 1}} op E_1)表示二进制左折,

  •   
  • E_2) op ) ... op E_N op {{ 1}} op E_1用于二进制右折叠。

  •   
     

在每种情况下, op fold-operator ,....

由于fold-expression的实例化是根据包含运算符的表达式进行的,因此运算符的所有常规规则,包括重载分辨率,评估顺序和内置运算符时的短路都适用。

答案 1 :(得分:-1)

虽然@ aschepler' s answer是特别正确的,但我想重复我的生活课程shared regarding another fine technical point (tuple order of destruction)

  

如果您可以为多种替代方案制定一个合理的论据,说明为什么该替代方案应该是标准规定的方案 - 那么您不应该假设它们中的任何一个是强制性的(即使其中一个恰好是)。< / p>

在折叠表达式和短路逻辑的背景下 - 它已经足够难以读取可变参数模板化代码,所以我试着保存我的代码的读者,关于是否折叠 - 短路发生...

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