Ответ 1
За [expr.prim.fold]/складной оператор:
фолд-оператор: один из
+ - * / % ^ & | << >> += -= *= /= %= ^= &= |= <<= >>= = == != < > <= >= && || , .* ->*
Так что >>=
- это фолд-оператор.
Выражение вида
(... op e)
гдеop
- оператор сгиба, называется унарной левой складкой. Выражение вида(e op...)
гдеop
- оператор сгиба, называется унарным правым сгибом. Одинарные левые складки и одинарные правые складки в совокупности называются одинарными складками. В одинарной складке приведенное выражение должно содержать нерасширенную упаковку ([temp.variadic]).
Итак, (enums >>=...)
- одинарное правильное сгибание.
Per [temp.variadic]/10:
Реализация выражения сгиба производит:
[...]
E 1 op (⋯ op (E N−1 op E N))
для одинарного правого сгиба,[...]
В каждом случае
op
- это оператор сгиба,N
- количество элементов в параметрах расширения пакета, и каждыйE i
генерируется путем создания экземпляра шаблона и замены каждого параметра расширения пакета егоi
м элементом. [...]
Следовательно, (enums >>=...)
семантически эквивалентны (A >>= (B >>= C))
при создании его экземпляра. Так что это ошибка в Clang.