c++ - 通过引用捕获异常时不会创建临时对象?

标签 c++ visual-c++ exception

class Error1
{

public:

int errorcode;
Error1(int x):errorcode(x){ cout<<"CTOR Error1"<<endl; }
//Error1(Error1& obj ){
//    errorcode = obj.errorcode;
//    cout<<"CopyCTOR Error1"<<endl;
//}
~Error1(){cout<<"DTOR Error1"<<endl; }
};

void fun()
{
cout<<"Inside fun"<<endl;
throw(Error1(5));
}

int main()
{
try{

    fun();
}
catch(Error1& eobj)
{
    cout<<"Error1 type occured with code:"<<eobj.errorcode<<endl;
}
cin.get();

}

输出:

Inside fun

CTOR Error1

DTOR Error1

Error1 type occured with code:5

DTOR Error1

此输出表明 Error1 对象是为 catch 处理程序复制构造的。由于没有为 Error1 对象定义复制构造函数,因此使用默认复制构造函数。

当我取消注释用于定义复制构造函数的注释部分时,我得到以下输出。

Inside fun

CTOR Error1

Error1 type occured with code:5

DTOR Error1

为什么只有一个 DTOR 被调用?即使通过引用捕获了异常,我相信仍然会创建一个临时文件。

最佳答案

你用的是什么编译器?

当您使用 Error1& obj 参数引入(即取消注释)您的复制构造函数版本时,代码应该变得无效。 throw 应该能够创建其参数的拷贝,而您的复制构造函数版本禁用临时复制。代码格式错误。如果您的编译器接受它,那可能是因为它非法允许将非常量引用绑定(bind)到临时对象(我怀疑它是启用了扩展的 MSVC++ 编译器)。

原始实验按预期/允许的方式进行。 throw 的参数被复制到一个内部临时文件中,稍后用于初始化 catch 参数。虽然允许编译器直接使用您的原始临时文件,但相应地延长了它的生命周期。

关于c++ - 通过引用捕获异常时不会创建临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372648/

相关文章:

c++ - 程序有问题吗

c++ - 如何在 C++ 中获取指向 main() 方法的函数指针?

c# - 如果我不调试应用程序,则不会捕获异常

c++ - 我应该在类构造函数内部还是外部初始化 shared_ptr ?

C++:将我的对象转换为不同的父类(super class)会导致不同的指针地址

javascript - C# 十进制到 C++ float 和 javascript 数字

c++ - 递归地在干草堆中查找针的索引。

c++ - 如何有效地调整 DirectX 窗口的大小?

.net - 有关 InvalidProgramException 的帮助(无效的 IL 代码?)

.net - 当参数相互冲突时抛出什么最合适的异常?