результат вычисления блочного оператора в c ++ - PullRequest
0 голосов
/ 24 ноября 2018

У меня самый простой оператор c ++, объявляющий переменную "a":

int a = ({ int b = 10; b; });

Как говорят недавние gcc и clang, это допустимый оператор, который действительно объявляет переменную a, имеющую значение 10.

Вопрос: что это?Я знаю о различных типах выражений.Я знаю о различных типах утверждений.Но я не могу найти в стандарте c ++ 14 упоминания о том, что «оператор блока как выражение возвращает последнее внутреннее вычисленное выражение» или что-то в этом роде.

Может кто-нибудь указать мне точные строки стандартного высказывания, котороеКодовая строка полностью действительна?

1 Ответ

0 голосов
/ 24 ноября 2018

Вопрос: что это?

Это расширение GNU для стандарта ISO C, расширение, которое также доступно для C ++, но также не является частью ISO C ++.

Ссылаясь на руководство GCC: Глава 6 - Расширения для семейства языков C :

...

Эти расширения доступныв C и Objective-C.Большинство из них также доступны на C ++....

  • Выражения операторов: Помещение операторов и объявлений в выражения.

Где последнее подробно объясняется в Руководство по GCC: Раздел 6.1- Операторы и объявления в выражениях :

Составной оператор, заключенный в скобки, может отображаться как выражение в GNU C. Это позволяет вам использовать в выражении циклы, переключатели и локальные переменные.

Напомним, что составной оператор представляет собой последовательность операторов, заключенную в фигурные скобки;в этой конструкции круглые скобки идут вокруг скобок.Например:

({ int y = foo (); int z;
   if (y > 0) z = y;
   else z = - y;
   z; })

является допустимым (хотя и немного более сложным, чем необходимо) выражением для абсолютного значения foo ().

...

Что касается Clang, Clang Language Extensions описывает, что Clang стремится поддерживать множество расширений GCC: [ emhpasis mine]:

Этот документ описывает языкрасширения предоставлены Clang.В дополнение к перечисленным здесь языковым расширениям Clang стремится поддерживать широкий диапазон расширений GCC .Для получения дополнительной информации об этих расширениях см. Руководство GCC .

...