Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385264

Is a declaration valid inside an if block with no actual block?

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.

Upvotes: 11

Views: 475

Answers (2)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385264

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

Upvotes: 25

Anton Kizema
Anton Kizema

Reputation: 1092

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.

Upvotes: 2

Related Questions