goto and RAII in C++

goto and RAII in C++

本文关键字:C++ in RAII and goto      更新时间:2023-10-16

可能重复:
转到块外:是否调用析构函数?

我知道C和C++中的goto运算符在几乎所有情况下都是无用的,但我只想通过兴趣来知道这个问题的答案,它没有实际意义。

C++标准是否保证在这种情况下必须正确调用对象的析构函数?

#include <iostream>
class Foo
{
public:
   Foo() { std::cout << "Foo::Foo() n"; }
   ~Foo() { std::cout << "Foo::~Foo() n"; }
};
int main()
{
   {
      std::size_t i = 0;
      _1:
      Foo instance;
      if (!++i)
      {
         goto _1;
      }
   }
   {
      Foo instance;
      goto _2;
   }
   _2:
   ;
}

http://liveworkspace.org/code/06031e6699c8fddda94b8594ccab1387

关于goto和C++RAII的其他奇怪情况呢?

如果你能在这里发布C++标准的引号,那将是非常酷的。

是。当自动对象超出范围时,保证会对其进行销毁。使用goto退出作用域的事实对此规则没有影响。

我能想到的唯一不适用的情况是,如果使用std::longjmp退出作用域(在这种情况下,如果有任何带有析构函数的对象,则行为是未定义的)。

n3376

6.6跳转语句:[stmt.Jump]

第2段

在退出一个范围(无论如何完成)时,在该范围内构建的具有自动存储持续时间(3.7.3)的对象将按其构建的相反顺序销毁。[注:临时费用见12.2--end note]转出循环、转出块、或返回经过具有自动存储持续时间的初始化变量涉及销毁具有自动存储时间的对象,这些对象在从传输点到传输点的范围内,但不在传输点到的范围内。(有关块中的传输,请参见6.7)。[注意:但是,程序可以终止(例如通过调用std::exit()或std::abort()(18.5)),而不会破坏具有自动存储持续时间的类对象。--end Note]