例外C ++:按引用/值捕获

时间:2016-10-31 14:05:20

标签: c++ exception

我有一个关于在C ++中捕获异常的问题。 请考虑以下示例,其中我们按价值捕捉:

Chart

让我们说struct baseException{}; struct derivedException : public baseException {}; void g(){ // Bad stuff if(!stuff) throw derivedException(); else throw baseException(); } void f(){ try{ g(); } catch(derivedException e){ // Caught derived exc } catch(baseException){ // Caught base exc } } 被抛出。编译器不会看到baseExceptionderivedException的特化,因此选择更正确的catch子句(baseException)?

我同意,如果抛出baseException,并且catch子句顺序被颠倒,切片会发生,但我不确定在这种情况下会发生什么。为什么编译器不能将其视为专业化?

我确实认为这是错误的方式,你应该总是通过引用来保留多态属性,但我想知道为什么编译器无法识别专业化。

1 个答案:

答案 0 :(得分:3)

catch子句的规则是第一次匹配是选择的匹配。与重载功能不同,没有" best"比赛。

因此,在示例代码中,如果stuff为false,则将执行catch(derivedException)的正文,因为抛出的异常具有类型derivedException;如果stuff为真,则catch(baseException)的主体将被执行,因为第一个catch子句不匹配,但第二个子句确实...

如果catch子句被反转,那么无论stuff的值如何,第一个catch子句(catch(baseException))的主体都将被执行,因为两个异常都可以被基类型捕获