【发布时间】:2010-03-09 04:56:34
【问题描述】:
我想知道,除了纯粹出于好奇(因为没有人应该编写这样的代码!),我想知道 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! ");
}
};
啊,谜团……
【问题讨论】:
-
我相信这种行为是正确的。否则,你怎么能在 JUMP 之后引用变量 g?