Ale*_* C. 43 c++ destructor goto
请考虑以下代码:
void foo()
{
{
CSomeClass bar;
// Some code here...
goto label;
// and here...
}
label:
// and here...
}
Run Code Online (Sandbox Code Playgroud)
bar的析构函数会被调用吗?
小智 62
C++标准说:
在从范围退出(但是已完成)时,将为所有具有自动存储持续时间(3.7.2)(命名对象或临时值)的构造对象调用析构函数(12.4),这些对象在其范围内声明,其声明的顺序与其声明的顺序相反.
所以答案是肯定的.
Vik*_*ehr 25
是的,他们会被召集.
更新:( 可以这样做,getos并不比抛出虚拟异常或者使用bools/ifs更糟糕.函数内部的简单goto不会使它成为意大利面条代码.)
1)是的.2)不要这样做.
详细说明:从概念上讲,这与通过一个循环留下一个循环没有什么不同break. goto然而,强烈反对强烈劝阻.它几乎从来没有必要使用goto,应该仔细检查任何用途,以找出正在发生的事情.
是的,正如其他人所说。C ++对此进行指定/授权。
但这只是为了完整起见:如果您goto使用goto某些编译器(例如gcc,clang,可能还有其他编译器中找到的compute-extend),但我最后不知道,包括MSVC,那么是否调用对象的析构函数就非常朦胧了。当a goto到达单个位置时,很清楚在控制流传输之前必须调用哪些析构函数。但是,通过计算后goto,可能需要动态调用不同的析构函数,以赋予“预期”语义。在这种情况下,我不确定实现此扩展的编译器会做什么。遇到这种情况,我的记忆是当计算出的goto可能会为带有非琐碎析构函数的对象留下范围,声称不会调用该析构函数。在某些情况下可能很好,而在其他情况下则不行。我不知道其他编译器会做什么。如果您要goto与非平凡析构函数的对象一起使用计算对象,只需注意这个问题。