【发布时间】:2011-01-02 15:24:31
【问题描述】:
我发现捕获异常有三种方式,有什么区别?
1) 按价值捕获;
2) 通过引用捕获;
3) 指针捕获;
我只知道按值捕获会调用对象的两个副本,按引用捕获会调用一个。那么如何通过指针捕获呢?何时使用指针捕获?除了抛出一个对象,我可以像这样抛出一个指向对象的指针吗?
class A {}
void f() {
A *p = new A();
throw p;
}
【问题讨论】:
-
您可以不通过指针捕获异常。您可以捕获恰好是指针的异常。问题是 A 和 A* 是两种完全不同的类型。如果你抛出一个指向 A 的指针,那么你只能捕获值或引用。但你通过价值或参考而不是 A 来捕捉的是 A*。
-
另外,由于 C++ 编译器被允许(尽管没有义务)省略这两个复制过程,并且对于第一个复制(然后抛出),如果不省略复制则必须移动对象而不是复制。
标签: c++ exception-handling throw try-catch