我想知道,没有其它目的不是纯粹的好奇心(因为任何人都不应该这样写代码!)关于RAII的行为如何与使用转到金属网格(可爱的想法是不是) 。当我们结合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应该从未实例化过(恕我直言,因为我不知道此代码的实际预期行为)。
这是怎么回事?
我意识到,如果我实例化鬼的代码不编译一个明确的构造函数...
class Ghost
{
public:
Ghost()
{
printf(" HAHAHA! ");
}
~Ghost()
{
printf(" BOO! ");
}
};
啊,神秘......
我相信这种行为是正确的。否则,如何在JUMP之后引用变量g? – leiz 2010-03-09 05:00:50
http://xkcd.com/292/ – 2010-03-09 05:21:19