为什么C ++在十字架初始化中强制执行此类行为?

时间:2012-07-03 08:04:33

标签: c++ language-design

假设我有一些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提及)?

  

可以转移到块中,但不能转移到块中   通过初始化绕过声明。一个从a跳的程序   具有自动存储持续时间的局部变量不在的点   范围到它在范围内的地方是不正确的,除非   变量具有POD类型(3.9)并且在没有初始化程序的情况下声明。

2 个答案:

答案 0 :(得分:15)

您无法跳过对象的初始化。

size_t i = 0; 

是初始化,而

size_t i;
i = 0;

不是。 C ++ Standart说:

  

可以转换为块,但不能以初始化绕过声明的方式。从具有自动存储持续时间的局部变量不在范围内的点跳转到其在范围内的点的程序是不正确的,除非该变量具有POD类型(3.9)并且在没有初始化器的情况下声明。

答案 1 :(得分:0)

规则的原因是跳过初始化会使对象处于未定义状态。当你到达函数的末尾时,销毁那些未初始化的对象可能不起作用。

显然有一个例外

int   i;
无论如何,

保留int未初始化,所以跳过这只是一半坏。

如果您想提前离开某个功能,可以选择快速return来避免使用goto