InQ*_*ive 1 c++ exception pass-by-reference
我的示例代码:
#include<iostream>
using namespace std;
class Test{ public: int set;};
Test T;
int main()
{
T.set = 100;
try{
throw T;
}
catch(Test &T)
{
T.set = 0;
}
cout<<T.set<<endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
这里我通过引用捕获抛出的T对象并在catch块中修改它的值.为什么在块之后T对象仍然打印?在这种情况下,参考语法对值的传递有什么用?100catch
编译器:gcc 5.1.0
您通过引用捕获异常对象,但不是这样抛出它.
异常总是 "按值抛出",因为它们必须分配在进程内存的一个特殊区域,该区域不受堆栈展开的影响.
[C++14: 15.1/3]:抛出异常copy-initializes(8.5,12.8)一个临时对象,称为异常对象.临时是一个左值,用于初始化匹配处理程序中声明的变量(15.3).[..]
这是一个通用规则,旨在解释更常见的情况,其中T实际上是try块本身或其封装函数本地.如果没有复制,就不可能从调用范围中捕获它.
我们通过引用捕获异常对象,以便您不必再次复制已经复制的异常对象T.当您的异常处于继承层次时,它还可以防止切片.有时人们会在将异常对象重新抛出到调用范围之前使用它来变异,尽管这似乎很罕见.
通过引用来捕获它const具有与通过引用来捕获任何其他东西相同的好处const:它确保您不会改变异常.如果你没有重新抛出它,那么这里没有任何实际好处,但如果像我一样,你const默认编写一个防止错误的故障保护,那么就没有理由不使用它.