Ответ 1
GCC 4.7.2 показывает, что, хотя код действителен, область x
по-прежнему является условным.
Область
Это связано с:
[C++11: 6.4/1]:
[..] Подстановка в инструкции выбора (каждое подстанция в формеelse
оператораif
) неявно определяет область блока. [..]
Следовательно, ваш код эквивалентен следующему:
int main()
{
if (true) {
int x = 42;
}
}
Действие
Это справедливо в терминах грамматики, потому что постановка для операторов выбора, таким образом (через [C++11: 6.4/1]
):
Выбор-оператор:
if
(условие) оператор
if
(условие) statementelse
statement
switch
(условие) оператор
и int x = 42;
- это оператор (через [C++11: 6/1]
):
утверждение:
меченый-оператор
атрибут-specifier-seq opt выражение-выражение
спецификатор-specifier-seq opt составной оператор
атрибут-specifier-seq opt выбор-выражение
атрибут-specifier-seq opt итерационный оператор
спецификатор-specifier-seq opt jump-statement
декларация-выражение
атрибут-specifier-seq opt try-block