题
考虑下面的代码:
#include <iostream>
#include <stdexcept>
void foo()
{
throw std::runtime_error("How long do I live?");
}
int main()
{
try
{
foo();
}
catch (std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
}
为什么可以通过参考捕捉异常时,不std::runtime_error("How long do I live?")
右值?
如何来异常对象仍处于catch块活着?
到底在哪存储抛出的异常的对象?什么是他们的寿命是多少?
没有正确的解决方案
其他提示
在C ++标准,段落15.1.4:
有关的临时副本的存储器 被抛出的异常是 在未指定的方式分配, 除非在3.7.3.1指出。的的 暂时仍然存在,只要有 处理程序正在为执行 例外即可。特别是,如果一个 处理程序退出通过执行掷; 声明中,将控制传递 另一个处理程序相同 例外,所以临时遗体。 在正在执行中的最后一个处理 为以任何方式异常退出 除了扔;临时对象 被破坏和实现 可以解除分配的存储器 临时对象;任何这样的 释放是在做不详 方式。破坏发生 破坏后,立即 在声明的对象 异常声明在处理程序中。
请注意,在C ++ - 标准交谈,一个处理程序表示与正确的参数类型一个catch
块
一个抛出的异常不是临时 - 编译器生成的异常代码保持它的一个永久拷贝。这样你就可以将其绑定到非const引用。
[编辑] 我只是检查的标准,它实际上指的是临时副本。然而,临时的寿命至少保证只要是作为异常处理程序的
正如所述尼尔,有内部编译器魔术回事。此外,要知道,编译器被允许创建任意数量的异常对象的副本。
对于试图理解语言的细节荣誉。与此同时,恕我直言,这是更为重要的是理解为什么你的应的捕获由参考异常(和值,把它扔),比为什么你的可以的
人们通常使用的异常类的层次结构,并通过引用捕获允许您利用多态性,并赶上基类的一个例外,当没有必要单独地处理个别异常类型。如果您无法通过引用抓到,你将不得不写catch
条款为每个可能的异常类型,可以在try
子句中被抛出。