Является ли следующее юридическое выражение сложения?
template <std::size_t N, std::size_t... Ix>
bool in_range(std::index_sequence<Ix...>) {
return ((Ix < N) && ...);
}
Является ли следующее юридическое выражение сложения?
template <std::size_t N, std::size_t... Ix>
bool in_range(std::index_sequence<Ix...>) {
return ((Ix < N) && ...);
}
Кланг делает правильную вещь, грамматика из Складные выражения Предложение выглядит следующим образом:
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) );
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 )
, поэтому он является первичным выражением, поэтому оно является постфиксным выражением, поэтому оно является унарным выражением, поэтому оно является литым выражением, поэтому оно может быть используется как операнд складного выражения.