假设我有一堂课
class C : public B {
public:
C() noexcept;
}
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)
因此,如果抛出一个子对象(无论是基类还是成员)构造函数,则它首先转到派生的构造函数,该构造函数不会并且不能††吞下该异常,因此如果构造函数将其传播到调用者也不例外。但既然如此,std::terminate
就会被调用。
†如果基类的确未按照派生类的要求进行抛出,则它确实满足要求,并且可以将自身声明为noexcept,因此非常有理由不这样做。也许,如果基类是必须支持c ++ 03的库的一部分,而派生类可能采用更高的标准,那将是有道理的。
††它可以抓住一个功能尝试块,但那些总是会再次抛出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句