Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 403
Lightness Races in Orbit Avatar asked Mar 22 '13 11:03

Lightness Races in Orbit


2 Answers

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-seqoptexpression-statement
  attribute-specifier-seqoptcompound-statement
  attribute-specifier-seqoptselection-statement
  attribute-specifier-seqoptiteration-statement
  attribute-specifier-seqoptjump-statement
  declaration-statement
  attribute-specifier-seqopttry-block

like image 125
Lightness Races in Orbit Avatar answered Nov 04 '22 20:11

Lightness Races in Orbit


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.

like image 2
Anton Kizema Avatar answered Nov 04 '22 20:11

Anton Kizema