Мне интересно, для каких-либо других целей, кроме чистого любопытства (потому что никто не должен ВСЕГДА писать такой код!) О том, как поведение RAII мешей с использованием goto (прекрасная идея не так) ,Что происходит, когда мы объединяем 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, потому что я не знаю фактического ожидаемого поведения этого кода).
Что случилось?
Я просто понял, что если я создаю экземпляр явный конструктор для Призрака код не компилируется ...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
Ах, тайна ...
Я считаю, что поведение верное. В противном случае, как бы вы могли ссылаться на переменную g после JUMP? – leiz
http://xkcd.com/292/ –