В комментариях вы уточняете, что
Мое намерение состоит в том, чтобы действительно (или как можно ближе) подражать Заявлению
Выражения, которые будут использоваться всеми возможными способами, с каждым
собственность у них есть.
Поэтому давайте посмотрим, как формируются выражения операторов и что они делают:
Составной оператор, заключенный в скобки, может выглядеть как
выражение в GNU C. Это позволяет вам использовать петли, переключатели и локальные
переменные в выражении.
[...]
Последнее в составном операторе должно быть выражением
сопровождается точкой с запятой; значение этого подвыражения служит
стоимость всей конструкции.
( Документация GCC )
Для этого есть две ключевые части:
Конструкция построена вокруг составного оператора и поэтому может иметь в пределах всего, что может иметь составной оператор.
Конструкция оценивает значение.
Более того, вы прямо говорите
В частности, результат последнего утверждения соединения
выражение должно нести как свой тип, так и значение, а не иметь
передается как параметр макроса.
Вы загнали себя в угол здесь. Операторы C не являются выражениями, что означает, что они не оцениваются по значениям. Вот почему операторские выражения GCC являются расширением. Значения не имеют связи, и в той степени, в которой они могут рассматриваться как имеющие область видимости, они ограничены выражениями, в которых они появляются, и объектами, которые их хранят. Единственный способ передать значение из оператора - это присвоить его объекту соответствующего типа (и вы явно хотите этого не делать) или return
(что требует, чтобы оно было в функции).
Существуют и другие характеристики выражений выписок, которые могли бы заинтересовать вас в первую очередь. В частности, поскольку вы подняли лямбду, я подозреваю, что вас интересует тот факт, что выражения операторов живут внутри контекста окружающего кода, так что, среди прочего, они могут использовать идентификаторы, которые там находятся в области видимости. Если это то, что вам нужно, то вам, вероятно, нужно просто написать обычные блоки кода и предоставить переменные, в которых будет сообщаться результат.
ОДНАКО, есть другая альтернатива, которая может дать вам немного того, что вы ищете. Вы можете вычислить несколько выражений по очереди, каждое из которых может использовать побочные эффекты предыдущих, используя оператор запятой. Например,
int first = 1, second = 2, temp, new_first;
new_first = (temp = second, second = first, first = temp);
В результате значения first
и second
меняются местами, а полученное новое значение first
присваивается new_first
. Конечно, это не позволяет использовать циклы, операторы if
, и т. Д. , и особенно не предусматривает объявления локальных переменных, таких как temp
. Как я сказал немного того, что могут делать выражения оператора.