c++ - goto 的 POD 和规则

标签 c++

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

相关文章:

c++ - 命名管道 : How to block until closed write side is reopened?

python - 如何填充图像边缘内的白色背景以去除背景?

c++ - 在 ubuntu 14.04 LTS 上编译 fileZilla

c++ - 用于库编译的C/C++约定/工具链

c++ - Qt - 具有自定义参数的可重用绘图函数

c++ - cin不接受C++中带有空格的输入吗?

c++ - SSLSocket setsockopt 返回 10042 和 WSAIoctl 10045

c# - Windows Mobile 6.0 蓝牙串口掉电/挂起后保活

c++ - 如何在 C++ 应用程序中使用 GnuPG(不是命令行工具)?

C++ 将 Int 拆分为 4 个部分(32 位机)