Мне интересно, ни с какой другой целью, кроме чистого любопытства (потому что никто никогда НЕ ДОЛЖЕН писать такой код!) О том, как поведение 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 никогда не нужно было бы создавать (ИМХО, потому что я не знаю фактическое ожидаемое поведение этого кода).
Что случилось?
Я только что понял, что если я создаю явный конструктор для Ghost, код не компилируется ...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
Ах, тайна ...