Почему это работает: последний оператор С++ в результате выражения

Я нашел странные макросы в реализации драйвера, которые я не могу объяснить себе. Упрощенный пример:

cout << ({int i=0; while(i<10) {++i;} i;}) << endl;

Он выведет 10.

Но почему это выражение вообще становится rvalue? Кажется, он работает в C и на С++.

Может кто-нибудь объяснить мне? Указывать на ключевые слова и ссылаться будет отлично.

Ответ 1

Это расширение GCC :

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

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