转到一个块:做析构函数被调用?

考虑下面的代码:

void foo() { { CSomeClass bar; // Some code here... goto label; // and here... } label: // and here... } 

酒吧的析构者会被调用吗?

C ++标准说:

在退出范围(但是已完成)时,对于在该范围内声明的具有自动存储持续时间(3.7.2)的所有构造对象(命名对象或临时对象),将按其声明的相反顺序调用析构函数(12.4)。

所以答案是“是”。

是的,他们会被叫来。

更新:(可以这样做,gotos并不比抛出虚假的exception或使用bools / ifs离开事物更糟糕,一个简单的goto在函数内部不会使它成为意大利式细面条代码。)

1)是的。 2)不要这样做。

详细说明:从概念上讲,这与通过break留下循环没有任何区别。 然而, goto强烈,强烈的气馁。 几乎没有必要使用goto ,任何使用都应该仔细检查以确定发生了什么。

是的,正如其他人所说的。 C ++指定/要求这个。

但是为了完整goto ,如果你的goto使用了在某些编译器中find的compute- goto扩展名 – gcc,clang,可能还有其他的,但是最后我不知道MSVC是否会调用对象的析构函数很朦胧。 当goto去到一个单独的位置时,非常清楚在控制stream转移之前必须调用哪些析构函数。 但是通过计算goto ,可能需要dynamic地调用不同的析构函数,以提供“预期的”语义。 在这种情况下,我不确定实现这个扩展的编译器是做什么的。 我遇到这种情况的记忆是,当clang警告时,计算goto可能会留下一个范围与一个非trival析构函数的对象,声称析构函数将不会被调用。 在某些情况下,这可能是好的,而在其他情况下则不好 我不知道其他编译器做什么。 只要知道这个问题,如果你想使用计算goto s与非平凡的析构函数的对象。