8 Expressions [expr]

8.1 Primary expressions [expr.prim]

8.1.6 Fold expressions [expr.prim.fold]

Выражение свертки выполняет свертку template parameter pack над бинарным оператором.

fold-expression:
	( cast-expression fold-operator ... )
	( ... fold-operator cast-expression )
	( cast-expression fold-operator ... fold-operator cast-expression )
fold-operator: one of
	+   -   *   /   %   ^   &   |   <<   >> 
	+=  -=  *=  /=  %=  ^=  &=  |=  <<=  >>=  =
	==  !=  <   >   <=  >=  &&  ||  ,    .*   ->*

Выражение формы, (... op e) где op есть a fold-operator , называется a unary left fold. Выражение формы, (e op ...) где op есть a fold-operator , называется a unary right fold. Унарные левые складки и унарные правые складки называются вместе unary folds. В унарном сгибе cast-expression должен содержать unexpanded parameter pack.

Выражение формы (e1 op1 ... op2 e2) where op1 и op2 are fold-operators называется a binary fold. В двоичной свертке, op1 и op2 должны быть одинаковыми fold-operator, и либо e1 должен содержать нерасширенный пакет параметров, либо e2 должен содержать нерасширенный пакет параметров, но не оба вместе. Если e2 содержит нерасширенный пакет параметров, выражение называется binary left fold. Если e1 содержит нерасширенный пакет параметров, выражение называется binary right fold. [Example:

template<typename ...Args>
bool f(Args ...args) {
  return (true && ... && args); // OK
}

template<typename ...Args>
bool f(Args ...args) {
  return (args + ... + args);   // error: both operands contain unexpanded parameter packs
}

end example]