goto 和析构函数兼容吗?

发布于 2024-07-09 20:11:54 字数 289 浏览 11 评论 0原文

此代码会导致未定义的行为:


void some_func() {
  goto undefined;
  {
    T x = T();
    undefined:
  }
}

不调用构造函数。

但是这段代码呢? x 的析构函数会被调用吗? 我想会的,但我想确定一下。 :)


void some_func() {
  {
    T x = T();
    goto out;
  }
  out:
}

This code leads to undefined behavior:


void some_func() {
  goto undefined;
  {
    T x = T();
    undefined:
  }
}

The constructor is not called.

But what about this code? Will the destructor of x be called? I think it will be, but I want to be sure. :)


void some_func() {
  {
    T x = T();
    goto out;
  }
  out:
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花之痕靓丽 2024-07-16 20:11:54

是的,析构函数将按预期被调用,就像您由于异常而提前退出作用域一样。

标准 6.6/2(跳转语句):

退出作用域时(无论完成情况如何),将为在该作用域中声明的所有具有自动存储持续时间的构造对象调用析构函数,按照其声明的相反顺序。

Yes, destructors will be called as expected, the same as if you exited the scope early due to an exception.

Standard 6.6/2 (Jump statements):

On exit from scope (however accomplished), destructors are called for all constructed objects with automatic storage duration that are declared in that scope, in the reverse order of their declaration.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文