Я смотрел эта почта в GitHub, но не мог понять, что имел в виду OP:
"full expression" suggest that it is a kind of expression, but sometimes it is not.
Моя интерпретация заключается в том, что «полное выражение» (термин, используемый в Стандарте) не может быть выражением. [intro.execution]/5 дает определение полного выражения следующим образом:
A full-expression is
(5.1) — an unevaluated operand (8.2),
(5.2) — a constant-expression (8.6),
(5.3) — an init-declarator (Clause 11) or a mem-initializer (15.6.2), including the constituent expressions of the initializer,
(5.4) — an invocation of a destructor generated at the end of the lifetime of an object other than a temporary object (15.2), or
(5.5) — an expression that is not a subexpression of another expression and that is not otherwise part of a full-expression.
Если моя интерпретация верна, я хотел бы знать, какой из приведенных выше пунктов дает полное выражение, которое не является выражением. В противном случае, то есть, если я ошибаюсь, что имел в виду ОП своим комментарием?
Я думаю, что дискуссия, на которую вы ссылаетесь, касается различия между «полным выражением», не являющимся стандартным языком, в то время как «полное выражение» является
имхо, было бы лучше, если бы вы переформулировали вопрос, чтобы не ссылаться на сообщения на github. Только ОП может знать, что они на самом деле имели в виду с этим комментарием





Формальный список выражений можно найти в [грамм.выражение]. Это довольно большой текст, поэтому я не буду включать его сюда, но, используя его, мы можем видеть, что init-декларатор и mem-инициализатор не являются выражениями в соответствии с грамматикой. Это означает, что хотя init-декларатор и mem-инициализатор считаются полными выражениями, грамматически они не являются выражениями.
Великолепно! Но я все еще сомневаюсь в следующем: почему спецификация должна включать декларатор (используется в определении init-декларатор) и идентификатор инициализатора памяти (используется в определении mem-инициализатор) в определении полное выражение?? ?
@JoãoAfonso Потому что это полные выражения. Вот почему вы можете делать такие вещи, как int i = 3, a = i++, b = i++; или foo(int i) : a(i++), b(i++) {}, и иметь определенное поведение. Каждый декларатор является полным выражением, поэтому нет конфликта при оценке i++. То же самое происходит в инициализаторах членов.
Поскольку ветка была о том, следует ли переносить «полное выражение» через дефис, ОП также мог иметь в виду, что удаление дефиса сделает более двусмысленным определение того, что это на самом деле выражение.