Мне интересно, без какой-либо иной цели, кроме чистого любопытства (потому что никому не следовало писать такой код!) о том, как поведение сечений 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! ");
}
};
А, тайна...