C ++标准说:
可以转移到块中,但不能以初始化绕过声明的方式转移。从具有自动存储持续时间的局部变量不在范围内的点跳转到其处于范围内的点的程序是错误的,除非该变量具有POD类型(3.9)且声明时没有初始化程序。
switch(k) { case1: int t = 4; break; default: break; }
这个代码会出现交叉初始化错误,因为可以跳过变量 t 的初始化,但是此后它仍然是在作用域内,即使它从来没有首先创建过也是如此。
switch(k) { case1: { int t = 4; } break; default: break; }
int t = 0; switch(k) { case1: t = 4; break; default: break; }
上面这两个代码就不会出错,因为变量位于块内,并且将在块的末尾死亡,因此任何情况下,他都不会在范围内。