goto和析构函数是否兼容?

Ser*_*kov 17 c++ goto

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


void some_func() {
  goto undefined;
  {
    T x = T();
    undefined:
  }
}
Run Code Online (Sandbox Code Playgroud)

不调用构造函数.

但是这段代码怎么样?x的析构函数会被调用吗?我想会是,但我想确定.:)


void some_func() {
  {
    T x = T();
    goto out;
  }
  out:
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*kin 43

是的,析构函数将按预期调用,就像您因异常而提前退出范围一样.

标准6.6/2(跳转声明):

在从范围退出(但是已完成)时,将为所有具有自动存储持续时间的构造对象调用析构函数,这些对象在该范围内以与其声明相反的顺序进行声明.