Можете ли вы использовать подвыражение в выражениях сгиба?

Является ли следующее юридическое выражение сложения?

template <std::size_t N, std::size_t... Ix>
bool in_range(std::index_sequence<Ix...>) {
  return ((Ix < N) && ...);
}

Он компилируется с clang, но не gcc

Ответ 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) );

Ответ 2

GCC ошибочен. Это ошибка 68377, предположительно введенная исправлением для ошибка 67810.

fold-expression:    
    ( cast-expression fold-operator ... )
    [...]

primary-expression:    
    [...]
    ( expression )
    [...]

postfix-expression:    
    primary-expression
    [...]

unary-expression:    
    postfix-expression
    [...]

cast-expression:
    unary-expression
    [...]

(Ix < N) имеет вид ( expression ), поэтому он является первичным выражением, поэтому оно является постфиксным выражением, поэтому оно является унарным выражением, поэтому оно является литым выражением, поэтому оно может быть используется как операнд складного выражения.