goto和CII中的RAII

Fro*_*art 6 c++ goto

可能重复:转
出一个块:析构函数被调用?

我知道在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:
   ;
}
Run Code Online (Sandbox Code Playgroud)

http://liveworkspace.org/code/06031e6​​699c8fddda94b8594ccab1387

那么goto和C++ RAII的其他情况呢?

如果你可以在这里发布C++标准的引用,那真的很酷.

Man*_*rse 10

是.保证自动对象超出范围时会被破坏.范围退出使用的事实goto对此规则没有影响.

我能想到的唯一情况是,如果使用std :: longjmp退出范围(在这种情况下,如果存在任何具有析构函数的对象,则行为未定义).

n3376

6.6跳转声明:[stmt.jump]

第2段

在从范围退出(但是已完成)时,在该范围内构造的具有自动存储持续时间(3.7.3)的对象将按其构造的相反顺序销毁.[注:对于临时学生,见12.2.-end note]从一个循环中转出一个循环,或者从具有自动存储持续时间的初始化变量返回过去涉及销毁具有自动存储持续时间的对象,这些对象在转移点但不在转移点的范围内. .(转入块中见6.7).[注意:但是,程序可以终止(例如,通过调用std :: exit()或std :: abort()(18.5)),而不会破坏具有自动存储持续时间的类对象. - 结束说明]