假设以下内容:
struct wrapper_exception {
std::runtime_error& err;
wrapper_exception( std::runtime_error& _e ) : err(e) {}
};
try {
throw std::runtime_error("foo");
} catch (std::runtime_error& err) {
throw wrapper_exception( err);
}
问题:处理后,在wrapper_exception中访问对runtime_error的引用是否安全?
答案 0 :(得分:6)
我很想说这是未定义的行为。
标准反复说,当活动处理程序退出而不是通过重新抛出异常时,异常对象的生命周期结束,即通过说throw;
。
由于您不重新抛出异常,原始异常对象在catch块的末尾到期,您最终会得到一个悬空引用,与抛出一个包含对局部变量的引用的对象没什么不同。