我们试图做的是这样的
try {
std::uninitialized_copy(...);
} catch(...) {
if(!boost::has_trivial_destructor<T>::value) {
// some cleanup to do here...
}
throw;
}
我们想知道,如果if
中的编译时常量为false,那么try/catch
是否会有成本。
编译器是否可以在其“as-if”权利范围内删除try/catch
并表现得好像没有try
包围它的std::uninitialized_copy
调用一样?
还是C++规范中有一些隐藏的东西需要编译器将其留在这里?例如,想象一个假设的surrounding_try_blocks()
函数,它返回当前框架周围动态尝试块计数。
try
,可能会出现一些异常永远不会被捕获的情况。我不太确定我是否理解了所有后果。如果调用不仅仅是uninitialized_copy
,而是将生命提升到更复杂的对象,例如,我非常确定我们可以有不同的可观察行为,因为标准允许编译器在异常最终没有被任何地方捕获时省略堆栈展开。 - Johannes Schaub - litbtry{throw 42;}catch(...){}
优化为nop)。但只要没有抛出异常,在所谓的零成本异常处理实现中,您不应该注意到任何成本。对于您的具体问题,假设此块位于函数末尾,我的主要关注点是异常的复制/移动,但我认为在这种情况下允许省略。 - Marc Glisse