投掷和捕捉整数是如何工作的?

Gha*_*ani 15 c++ exception try-catch

使用此代码:

int main()
{
    try
    {
        throw -1;
    }
    catch (int& x)
    {
        std::cerr << "We caught an int exception with value: " << x << std::endl;
    }
    std::cout << "Continuing on our merry way." << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们有:

/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Run Code Online (Sandbox Code Playgroud)

catch块如何读取-1int&?我们无法为非常量左值引用赋值。

为什么第二条std::cout语句在第一条std::cerr语句之前执行?

Nat*_*ica 10

这是可以的,因为[except.throw]/3

抛出异常复制初始化([dcl.init],[class.copy.ctor])一个临时对象,称为异常对象。表示临时值的左值用于初始化在匹配处理程序([except.handle])中声明的变量

强调我的

如您所见,即使它是临时的,编译器也将其视为用于初始化处理程序的左值。因此,您不需要 const 引用。

  • 但是消息出现的顺序是怎样的呢? (2认同)

Som*_*ude 8

这个throw参考

与其他临时对象不同,异常对象在初始化catch子句参数时被认为是左值参数,因此可以被左值引用捕获、修改和重新抛出。

因此,虽然“对象”是临时的,但它仍然是一个左值,因此您可以通过引用来捕获它。