gpt4 book ai didi

c++ - goto 的 POD 和规则

转载 作者:行者123 更新时间:2023-11-28 03:15:02 25 4
gpt4 key购买 nike

来自此常见问题解答: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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com