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:

  1. What is crosses initialization?
  2. Why do the first initializer x + y pass the compilation, but the latter failed?
  3. 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.

Edit
Report