2

这段代码

try
{
    opaque_function_that_might_throw_arbitrary_exception ();
}
catch (...)
{
    throw;
}

在任何语义上都与调用不同

opaque_function_that_might_throw_arbitrary_exception ();

在 C++ 中?标准之间有区别吗?

虽然这两个片段在语义上是相同的,但我检查了编译器 - 资源管理器并生成不同的代码,即使在最高优化级别也是如此。这让我想知道我是否缺少某些东西。

4

1 回答 1

4

是的,在一个特定的地方有细微的差别。考虑这个主要功能:

int main() {
   RAIIHandle important_resource{ /*...*/ };

   opaque_function_that_might_throw_arbitrary_exception ();
}

抛出异常后是否被important_resource释放?好吧,它是实现定义的。std::terminate被调用,但如果异常从main. 对于某些资源,这可能会带来真正的麻烦。

现在在这种情况下:

int main() {
   try {
     RAIIHandle important_resource{ /*...*/ };
     opaque_function_that_might_throw_arbitrary_exception ();
   }
   catch(...) {
     throw;
   }
}

std::terminate仍然被称为。但不是在为异常找到合适的处理程序之前。堆栈必须展开。所以我们important_resource绝对是自由的。

于 2017-12-17T20:27:46.097 回答