8

我想知道异常对象是如何创建的?为什么处理函数参数可以是非常量引用?

例如:

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")只是一个临时对象,我也有一个接受非常量引用的处理程序。

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

4

1 回答 1

11

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

当你这样做时:

throw E("Out of memory");

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

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

为什么处理函数参数可以是非常量引用?

当你抓住物体时:

catch(E& e)

您将在它被复制到的私有位置获得对该对象的引用。它不是 const(或临时)值,因此您可以正常引用它。

于 2012-10-21T16:18:34.590 回答