RAIIの振る舞いがgotoの使用とどのようにかみ合うかについての純粋な好奇心(誰もこのようなコードを書くべきではないからです!)以外の目的ではないのだろうかと思います(素敵なアイデアではありません)。
class Two
{
public:
~Two()
{
printf("2,");
}
};
class Ghost
{
public:
~Ghost()
{
printf(" BOO! ");
}
};
void foo()
{
{
Two t;
printf("1,");
goto JUMP;
}
Ghost g;
JUMP:
printf("3");
}
int main()
{
foo();
}
Visual Studio 2005で次のコードを実行すると、次の出力が得られます。
1,2,3 BOO!
しかし、私は想像し、推測し、「BOO!」を望んでいました。Ghostがインスタンス化されるべきではなかったため、実際には表示されません(IMHO、このコードの実際の予想される動作がわからないため)。
どうしたの?
Ghostの明示的なコンストラクターをインスタンス化すると、コードがコンパイルされないことに気づきました...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
ああ、謎...