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 crosses initialization of 'int r'
. My questions are:
crosses initialization
?x + y
pass the compilation, but the latter failed?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.
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With