考虑下面的代码:

#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子句中被抛出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top