答案是:如果在某处一个带有初值的变量位于作用域之外,在另一处该变量位于作用 域之内,则从前一处跳转到后一处的行为是非法行为。
case true:
//因为程序的执行流程可能绕开下面的初始化语句,所以该switch语句不合法
string file_name; //错误:控制流绕过一个隐式初始化的变量
int ival = 0; //错误:控制流绕过一个显式初始化的变量
int jval; //正确:因为jval没有初始化
break;
case false:
//正确:jval虽然在作用域内,但是它没有被初始化
jval = next_num(); // 正确:给jval 赋一个值
if (file_name.empty () ) // file_name在作用域内,但是没有被初始化
//...
假设上述代码合法,则一旦控制流直接跳到false分支,也就同时略过了变量file_name 和ival的初始化过程。此时这两个变量位于作用域之内,跟在false之后的代码试图 在尚未初始化的情况下使用它们,这显然是行不通的。因此C++语言规定,不允许跨过变 量的初始化语句直接跳转到该变量作用域内的另一个位置。
如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从 而确保后面的所有case标签都在变量的作用域之外。
case true:
{
//正确:声明语句位于语句块内部 string file_name = get_file_name();
//...
}
break;
case false:
if (file_name.empty()} // 错误:file_name 不在作用域之内