11

Is the following code valid? If so, what is the scope of x?

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

My intuition says that there is no scope created by the if because no actual block ({}) follows it.

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055

2 Answers2

25

GCC 4.7.2 shows us that, while the code is valid, the scope of x is still simply the conditional.

Scope

This is due to:

[C++11: 6.4/1]: [..] The substatement in a selection-statement (each substatement, in the else form of the if statement) implicitly defines a block scope. [..]

Consequently, your code is equivalent to the following:

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

Validity

It's valid in terms of the grammar because the production for selection statements is thus (by [C++11: 6.4/1]):

selection-statement:
  if ( condition ) statement
  if ( condition ) statement else statement
  switch ( condition ) statement

and int x = 42; is a statement (by [C++11: 6/1]):

statement:
  labeled-statement
  attribute-specifier-seqopt expression-statement
  attribute-specifier-seqopt compound-statement
  attribute-specifier-seqopt selection-statement
  attribute-specifier-seqopt iteration-statement
  attribute-specifier-seqopt jump-statement
  declaration-statement
  attribute-specifier-seqopt try-block

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
2

My Visual studio says that time of life of your variable x is pretty small - just while we are inside operator if, so x vill be destroyed when we are out of if condition, and there is absolutely no meaning to declare variables like this.

R. Martinho Fernandes
  • 228,013
  • 71
  • 433
  • 510
Anton Kizema
  • 1,072
  • 3
  • 13
  • 27