switch (t)
{
case 0:
int a = 0;
break; // NOT OK
case 1:
int b;
b = 0;
break; // OK
default:
break;
}
C++ case语句当中不能出现带初始化的变量声明,只能出现POD类型,同时不带初始化的变量声明。
C++ Standard当中已经说明这一点。
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps(77) 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).
(*) The transfer from the condition of a switch statement to a case label is considered a jump in this respect.
比较安全的情况,一般是用花括号限制变量的scope。
针对上面代码片段case 0和case 1的个人看法:
对于int a = 0;的形式,其scope在case 0和case 1都有作用,但是在declare的时候给了一个初值,所以在case 0和case 1的使用方式就不同了。C++当中的case分支可以看成是labels,case 0和case 1是等同的并列关系,但是现在case 0有初始化,case 1没有初始化,使用方式不同了,所以编译器会提示错误。
对于int b; b = 0;的形式,其scope在case 1和default都有作用,declare的时候没有给初始,是一个不确定的值。case 1当中后面b = 0;可以看成是对b变量的使用(赋值),在default分支也可以对b进行赋值等操作,在case 1和default对b的使用方式是相同的,所以没有提示错误。
参考:
http://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement