Regular goto
在 C++ 中尊重对象生命周期 - 即使用goto
跳出块将为适当的局部变量运行析构函数。
start:
NonTrivial object;
if (again()) goto start; // will call object.~NonTrivial()
使用时也是如此标签作为值 https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html#Labels-as-Values扩大?
start:
NonTrivial object;
goto *(again() ? &&start : &&end);
end:
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
查找拨打的电话NonTrivial()
and ~NonTrivial()
in 编译器资源管理器 https://godbolt.org/z/sF66qG.
哪个编译器行为正确?一般来说,是否有可能支持这种间接分支并正确管理对象生存期和 RAII?
哪个编译器行为正确?
由于我们讨论的是GCC的语言扩展,所以不能用C++标准来判断。但可以合理地预期编译器会自动调用这里的析构函数与构造函数相同的次数,或者拒绝像 Clang 一样编译。
一般来说,是否有可能支持这种间接分支并正确管理对象生存期和 RAII?
可能是的,因为 GCC 错误已报告且尚未关闭:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37722 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=37722
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)