计算出的“goto”是否尊重 C++ 对象的生命周期?

Fil*_*ipp 5 c++ gcc goto raii

C++ 中的常规goto尊重对象生命周期 - 即使用goto跳出块将为适当的局部变量运行析构函数。

start:
NonTrivial object;
if (again()) goto start;  // will call object.~NonTrivial()
Run Code Online (Sandbox Code Playgroud)

使用标签作为值扩展时也是如此吗?

start:
NonTrivial object;
goto *(again() ? &&start : &&end);
end:
Run Code Online (Sandbox Code Playgroud)

GCC 很高兴地接受了这段代码,但似乎忽略了goto可能对object生命周期产生的任何影响。铿锵抱怨:

error: cannot jump from this indirect goto statement to one of its possible targets
note: possible target of indirect goto statement
note: jump exits scope of variable with non-trivial destructor   
Run Code Online (Sandbox Code Playgroud)

查找对Compiler Explorer 的NonTrivial()调用以及~NonTrivial()在 Compiler Explorer 中的调用。

哪个编译器行为正确?一般来说,是否有可能支持这种间接分支并正确管理对象生存期和 RAII?

Fed*_*dor 1

哪个编译器行为正确?

由于我们讨论的是GCC的语言扩展,所以不能用C++标准来判断。但可以合理地预期编译器会自动调用这里的析构函数与构造函数相同的次数,或者拒绝像 Clang 一样编译。

一般来说,是否有可能支持这种间接分支并正确管理对象生存期和 RAII?

可能是的,因为 GCC 错误已报告且尚未关闭:https://gcc.gnu.org/bugzilla/show_bug.cgi ?id=37722