异常对象寿命

Exception object lifetime

本文关键字:对象 异常      更新时间:2023-10-16

我想知道如何创建异常对象?以及为什么处理程序函数参数可以是非const参考?

例如:

class E{
    public:
    const  char * error;
    E(const char* arg):error(arg){
    cout << "Constructor of E(): ";}
    E(const E& m){
        cout << "Copy constructor E(E& m): " ;
       error=m.error;
    }
};

int main(){
try{
    throw E("Out of memory");
}
catch(E& e){cout << e.error;}
}

输出:e()的构造函数:不记忆

所以我有throw E("out of memory")E("out of memory")只是一个临时对象,除了E("out of memory")之外,没有创建对象,因为没有调用复制构造函数。因此,即使此E("out of memory")只是一个临时对象,我也有一个处理程序,可以进行非const参考。

你能向我解释为什么这是可能的吗?

想知道如何创建异常对象?

当您这样做时:

throw E("Out of memory");

您在本地创建一个对象(E类型)。抛出此对象的过程将此对象副本抄录到标准未定义的某些私有内存位置。因此,要扔的对象必须是可复制的。

注意:允许编译器优化副本并直接在私有位置创建。因此,未复制的事实是因为编译器优化了副本(因此它不再是局部)。尝试将复制构造函数私有化,现在它将无法编译。

为什么处理程序函数参数可以是非const参考?

当您捕获对象时:

catch(E& e)

您正在复制到私有位置的对象。它不是const(或临时)值,因此您可以正常参考它。