Является ли объявление допустимым внутри блока if без фактического блока?

Является ли следующий код действительным? Если да, то каков объем x?

int main()
{
   if (true) int x = 42;
}

Моя интуиция говорит, что не существует области, созданной if, потому что за ним не следует фактический блок ({}).

Ответ 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 (условие) statement else 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

Ответ 2

Моя Visual studio говорит, что время жизни вашей переменной x довольно мало - просто пока мы находимся внутри оператора, если, так что x vill будет уничтожен, когда мы выйдем из условия if, и нет абсолютно никакого смысла для объявляйте такие переменные.