C++ goto和析构函数兼容吗?

C++ goto和析构函数兼容吗?,c++,goto,C++,Goto,此代码导致未定义的行为: void some_func() { goto undefined; { T x = T(); undefined: } } 未调用构造函数 但是这个代码呢?x的析构函数会被调用吗?我想会的,但我想确定。:) 是的,将按预期调用析构函数,这与由于异常而提前退出作用域的情况相同 标准6.6/2(跳转语句): 在退出作用域时(无论如何完成),将为在该作用域中声明的具有自动存储持续时间的所有构造对象调用析构函数,顺序与其声明相反 第一个代码示例

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


void some_func() {
  goto undefined;
  {
    T x = T();
    undefined:
  }
}
未调用构造函数

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


是的,将按预期调用析构函数,这与由于异常而提前退出作用域的情况相同

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

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


第一个代码示例不会导致未定义的行为,它是非法的并且不会编译。“不会编译”是未定义行为的一个示例,我认为。我现在读的这本书说的是“未定义的行为”。这两种行为在技术上是不同的:如果编译器被要求拒绝该程序,那么从程序员的角度来看,这“不那么糟糕”,而不是在程序运行时可能编译并烧毁他的房子。有些编译器拒绝接受合法的东西,但编译器知道这些东西是未定义的。@SergeySkoblikov:这本书错了!UB和病态是非常不同的。

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