Ответ 1
Кланг делает правильную вещь, грамматика из Складные выражения Предложение выглядит следующим образом:
fold-expression:
( cast-expression fold-operator ... )
( ... fold-operator cast-expression )
( cast-expression fold-operator ... fold-operator cast-expression )
и содержит следующую формулировку, применимую к этому случаю (акцент мой):
Выражение формы (... op e), где op - оператор сгиба, называется унарной левой складкой. Выражение формы (e op...), где op - оператор сгиба, называется унарной правой складкой. Унарные левые складки и унарные правые складки коллективно называются унарными складками. В унарной складке выражение-выражение должно содержать пакет нерастянутых параметров.
и (Ix < N)
- это действительно выражение, так что это выглядит справедливым. Мы можем видеть цепочку, которая доставит нас туда, как следует из грамматики в разделе 5
:
cast-expression -> unary-expression -> postfix-expression ->
primary-expression -> (expression)
T.C. указал на следующий отчет gcc bug [С++ 1z] "двоичное выражение в операнде сгиба-выражения" при сгибании выражения, в котором сообщается о аналогичный вопрос, но он по-прежнему не подтвержден.
Похоже, что это также ломается в gcc для двоичных левых и правых сгибов, например:
return ( (Ix < N) && ... && (N < 10) );
и
return ( (N < 10) && ... && (Ix < N) );