假设我有一些 C++ 代码:
if (error)
goto exit;
...
// size_t i = 0; //error
size_t i;
i = 0;
...
exit:
...
我知道我们不应该使用goto
,但为什么仍然使用
size_t i;
i = 0;
编译而不编译size_t i = 0;
?
为什么标准会强制执行这种行为(@SingerOfTheFall 提到)?
假设我有一些 C++ 代码:
if (error)
goto exit;
...
// size_t i = 0; //error
size_t i;
i = 0;
...
exit:
...
我知道我们不应该使用goto
,但为什么仍然使用
size_t i;
i = 0;
编译而不编译size_t i = 0;
?
为什么标准会强制执行这种行为(@SingerOfTheFall 提到)?
您不能跳过对象的初始化。
size_t i = 0;
是一个初始化,而
size_t i;
i = 0;
不是。
C++ 标准说:
可以转移到一个块中,但不能通过初始化绕过声明的方式。从具有自动存储持续时间的局部变量不在范围内的点跳转到它在范围内的点的程序是格式错误的,除非该变量具有 POD 类型 (3.9) 并且在没有初始化程序的情况下声明。
该规则的原因是跳过初始化会使对象处于未定义状态。当你到达函数的末尾时,销毁那些未初始化的对象可能不起作用。
一个例外显然是
int i;
无论如何都会留下int
未初始化的,所以跳过它只是坏了一半。
如果你想提前离开一个函数,一个快速return
的选项是避免goto
.