rsj*_*ffe 9 c++ exception c++11
假设我有一堂课
class C : public B {
public:
C() noexcept;
}
Run Code Online (Sandbox Code Playgroud)
说明noexcept符是否需要基类的相同承诺?也就是说,当我考虑使用noexcept时,我只是看看C :: C()的行为还是我还需要考虑B :: B()是否可能抛出异常?
例如,如果B :: B抛出异常,那么它会传播到C :: C还是要求新类实例的代码? - 如果传播到C :: C,那么如果构造函数的基类不是noexcept,那么这将是避免构造函数noexcept的一个原因.
有技术上†基类的构造函数不要求声明noexcept,但决不能丢,当被宣布noexcept派生的构造函数调用.
所以,是的,你需要考虑基类构造函数是否可以抛出(异常或其他).
我想问一个更好的问题是:下一个例外在哪里?
呼叫流程如下:
caller
-> derived constructor (the noexcept applies to this)
-> subobject constructors (includes bases)
- derived constructor body (not a call, but part of the derived constructor that is executed after the subobjects are constructed)
Run Code Online (Sandbox Code Playgroud)
因此,如果一个子对象(无论是基础还是成员)抛出,它首先会转到派生的构造函数,它不会也不能††吞下异常,因此它会传播给调用者,如果构造函数不是没有.但是既然如此,std::terminate就会被召唤.
†如果基数确实没有按照派生的要求抛出,那么它确实符合要求并且本身可以被声明为noexcept,因此有很多理由不这样做.也许,如果基类是必须支持c ++ 03的库的一部分,而派生类可能采用更高的标准,那么它是有意义的.
††它可以捕获一个函数try-block,但是它们总会再次抛出.