gpt4 book ai didi

c++ - 当我们结合 RAII 和 GOTO 时会发生什么?

转载 作者:IT老高 更新时间:2023-10-28 22:35:35 25 4
gpt4 key购买 nike

我想知道,除了纯粹出于好奇(因为没有人应该编写这样的代码!)之外,我想知道 RAII 的行为如何与 goto< 的使用相结合/strong>(不是很可爱)。

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! ");
}
};

啊,谜团……

最佳答案

标准明确地谈到了这一点——举个例子; 6.7/3“声明声明”(重点由我添加):

Variables with automatic storage duration are initialized each time their declaration-statement is executed. Variables with automatic storage duration declared in the block are destroyed on exit from the block.

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type and is declared without an initializer.

[Example:

void f()
{
//...
goto lx; //ill-formed: jump into scope of a
//...

ly:
X a = 1;
//...

lx:
goto ly; //OK, jump implies destructor
//call for a, followed by construction
//again immediately following label ly
}

—end example]

所以在我看来 MSVC 的行为不符合标准 - Ghost 不是 POD 类型,因此当 goto 语句为编码跳过它。

我尝试过的其他几个编译器(GCC 和 Digital Mars)出现错误。 Comeau 发出警告(但公平地说,我的 Comeau 构建脚本已将其配置为与 MSVC 高度兼容,因此它可能是有意效仿微软的做法)。

关于c++ - 当我们结合 RAII 和 GOTO 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com