这段代码
try
{
opaque_function_that_might_throw_arbitrary_exception ();
}
catch (...)
{
throw;
}
在语义上与仅调用
有任何不同opaque_function_that_might_throw_arbitrary_exception ();
在C ++中?标准之间是否存在差异?
我虽然两个片段在语义上都是相同的,但我检查了编译器 - 资源管理器,它生成了不同的代码,即使在最高的优化级别。这让我想知道是否有一些我不知道的东西。
答案 0 :(得分: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
肯定会被释放。