我想知道,纯粹出于好奇(因为没有人应该编写这样的代码!)关于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! ");
}
};
啊,奥秘……