Why does does a jump to a case label cross initialization in this switch?

c++, initialization, switch-statement

Solution

The version with `int r = x + y;` won't compile either.

The problem is that it is possible for `r` to come to scope without its initializer being executed. The code would compile fine if you removed the initializer completely (i.e. the line would read `int r;`).

The best thing you can do is to limit the scope of the variable. That way you'll satisfy both the compiler and the reader.

switch(i)
{
case 1:
    {
        int r = 1;
        cout << r;
    }
    break;
case 2:
    {
        int r = x - y;
        cout << r;
    }
    break;
};

The Standard says (6.7/3):

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5).

Problem

Consider the following code: ``` #include <iostream> using namespace std; int main() { int x, y, i; cin >> x >> y >> i; switch(i) { case 1: // int r = x + y; -- OK int r = 1; // Failed to Compile cout << r; break; case 2: r = x - y; cout << r; break; }; } ``` G++ complains: ``` <source>: In function 'int main()': <source>:14:14: error: jump to case label 14 | case 2: | ^ <source>:11:17: note: crosses initialization of 'int r' 11 | int r = 1; // Failed to Compile | ^ ``` My questions are: - What is `crosses initialization`? - Why do the first initializer `x + y` pass the compilation, but the latter failed? - What are the problems of so-called `crosses initialization`? I know I should use brackets to specify the scope of `r`, but I want to know why, for example why non-POD could not be defined in a multi-case switch statement.

Original source

Related problems