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

c++, language-lawyer

Solution

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

Problem

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.

Original source

Related problems