6

重複の可能性:
ブロックの外に移動: デストラクタは呼び出されますか?

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/06031e6​​699c8fddda94b8594ccab1387

また、goto と C++ RAII を使用したその他の状況についてはどうでしょうか。

C++ 標準からの引用をここに投稿できれば、本当にクールです。

4

1 に答える 1

11

はい。自動オブジェクトは、スコープ外に出ると破棄されることが保証されています。を使用してスコープを終了したという事実は、gotoこのルールには影響しません。

これが成り立たない唯一の状況は、スコープがstd::longjmpを使用して終了した場合です (この場合、デストラクタを持つオブジェクトがある場合、動作は未定義です)。

n3376

6.6 ジャンプ文: [stmt.jump]

パラグラフ 2

スコープから出ると (どのように達成されても)、そのスコープで構築された自動保存期間 (3.7.3) を持つオブジェクトは、それらの構築の逆の順序で破棄されます。[ 注: 一時的なものについては、12.2 を参照してください。—終わりの注] ループからの転送、ブロックからの転送、または自動保存期間を持つ初期化された変数を過ぎた後の転送には、転送元のポイントではスコープ内にあるが転送先のポイントではスコープ内にない、自動ストレージ期間を持つオブジェクトの破棄が含まれます。 . (ブロックへの転送については 6.7 を参照)。[注: ただし、自動保存期間を持つクラス オブジェクトを破棄することなく、プログラムを終了することができます (たとえば、std::exit() または std::abort() (18.5) を呼び出すことによって)。— エンドノート]

于 2012-08-27T20:19:53.350 に答える