- 使用goto不能跳过变量得初始化;
例子:
……
goto test;
int i;
string str;
test:
{
……
}
……
为什么这里通不过编译呢?把string str;这一句拿到goto之前就可以了?
为什么后面的int i;这一句不需要拿到goto之前呢?
解答:
在c++ Primer中倒是提到,goto 不能向前跳过变量定义语句,给出的理由是可能引起未定义的变量使用。当确实要这样使用时,需要把定义语句使用{}括起来。
据我推断,基本类型如int这种,在栈中是被默认初始化的。而对象如string这种,是需要在运行时执行构造函数的,如果goto跳过string的定义,那string的构造函数就得不到执行,那么string占用的栈空间就会处于未初始化状态,可能C++认为这会导致风险,所以就禁止了这种情形的发生。