来自此常见问题解答:What are Aggregates and PODs and how/why are they special?
我们有这部分:
goto语句。您可能知道,通过 goto 从某个变量尚未在范围内的点跳转到它已经在范围内的点是非法的(编译器应该发出错误)。此限制仅适用于变量是非 POD 类型的情况。在以下示例中,f() 格式错误,而 g() 格式正确。请注意,Microsoft 编译器对这条规则过于宽松 - 只是在两种情况下都发出警告。
int f() {
struct NonPOD { NonPOD(){}};
goto label;
NonPOD x;
label:
return 0;
}
int g(){
struct POD {int i; char c;};
goto label;
POD x;
label:
return 0;
}
我想了解为什么会有所不同?看起来可能是即使 POD 是 在 goto 之后声明它已经被初始化,不需要做更多的事情,而 非 POD 未初始化。还是我找错了树?
最佳答案
Goto 不能跳过一个初始化,除非它出现在一个 block 中,而您跳过了整个 block 。
对于非 POD,将调用 ctor。这是必要的,而且必须发生在变量出现的地方。如果您可以跳过它,则可以在损坏状态下访问该变量。最终它的 dtor 会爆炸程序。
关于c++ - goto 的 POD 和规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17174899/