我熟悉 C++ 异常的心理模型,以及如何以编程方式控制它。例如,此答案中的所有内容:SO Question on topic
然而,让我感到困惑的是,如果异常对象是在抛出堆栈帧中实例化的值,并且当前帧和任意数量的先前帧被展开,那么如何保留异常对象(catch 能够拦截的内容)所有拥有的本地人都被破坏(如果用 RAII 编写)合规性。为了使事情变得不那么容易理解,建议的模式是按value抛出,并按const&捕获...一个堆栈已经消失的值?...在很久以前被破坏的帧上引用一个可能未命名的值?我显然错过了一些东西。引用 exited-local-function-objects 是一个典型的新手错误,但在这种情况下,建议这样做。我推测与用户代码混合的 throw catch 模式是一种错觉,其实现完全不同,但这让我仍然想知道,(隐式未分配堆)异常对象存储在哪里,因此可以在运行时捕获它-变量位置,考虑到它的值似乎存储在其中的堆栈帧注定要立即展开?
编辑:受@RichardCritten 的“实现细节响应”启发的一些切题问题:如果异常对象被实例化为左值而不是抛出怎么办?如果这样的左值被参数化和争论,然后被另一个函数抛出(它保证仍然知道抛出上下文)怎么办?如果对象是用 new 分配的,并且它的引用被用来抛出怎么办?您是否被迫“按照建议使用例外,并相信它们会按照标准要求行事”?