我想知道异常对象是如何创建的?为什么处理函数参数可以是非常量引用?
例如:
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")
只是一个临时对象,我有一个接受非常量引用的处理程序。
你能给我解释一下为什么这是可能的吗?
最佳答案
want to know how the exception object is created ?
当你这样做时:
throw E("Out of memory");
您在本地创建一个对象(类型 E)。抛出过程将此对象复制到标准未定义的某个私有(private)内存位置。因此被抛出的对象必须是可复制的。
注意:允许编译器优化拷贝并直接在私有(private)位置创建它。所以它没有被复制的事实是因为编译器优化了拷贝(所以它不再是本地的)。尝试将复制构造函数设为私有(private),现在它将无法编译。
and why the handler function parameter can be a non-const reference ?
当你捕获物体时:
catch(E& e)
您正在获取对象复制到的私有(private)位置的引用。它不是常量(或临时)值,因此您可以正常引用它。
关于c++ - 异常对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12999448/