来自此常见问题解答:什么是聚合和 POD,它们如何/为什么特别?
我们有这部分:
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;
}
我想了解为什么会有差异?似乎可能是即使在 goto 之后声明了 POD,它也已经初始化并且不需要做任何其他事情,而非 POD 没有初始化。还是我在叫错树?