Ale*_*Dan 8 c++ exception object lifetime
我想知道如何创建异常对象?以及为什么处理函数参数可以是非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;}
}
Run Code Online (Sandbox Code Playgroud)
输出:
E()的构造函数:内存不足
所以我有throw E("out of memory")和E("out of memory")仅仅是一个临时对象,没有对象被创建除外E("out of memory"),因为没有拷贝构造函数被调用.所以即使这E("out of memory")只是一个临时对象,我有一个非const引用的处理程序.
你能解释一下为什么这是可能的吗?
Mar*_*ork 10
想知道如何创建异常对象?
当你这样做:
throw E("Out of memory");
Run Code Online (Sandbox Code Playgroud)
您在本地创建一个对象(类型E).抛出过程将此对象复制到未由标准定义的某个私有内存位置.因此,抛出的对象必须是可复制的.
注意:允许编译器优化副本并直接在私有位置创建它.所以它没有被复制的事实是因为编译器优化了副本(所以它不再是本地的).尝试将复制构造函数设为私有,现在它将无法编译.
以及为什么处理函数参数可以是非const引用?
当你抓住对象时:
catch(E& e)
Run Code Online (Sandbox Code Playgroud)
您将在复制到的私有位置获取对象的引用.它不是const(或临时)值,因此您可以对其进行常规引用.
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |