【发布时间】:2016-08-10 19:40:21
【问题描述】:
假设我有一堂课
class C : public B {
public:
C() noexcept;
}
noexcept 说明符是否需要基类的相同承诺?也就是说,我在考虑使用noexcept的时候,是只看C::C()的行为还是还需要考虑B::B()是否会抛出异常?
例如,如果 B::B 抛出异常,它会传播到 C::C 还是传播到请求新类实例的代码? -- 如果传播到 C::C,如果基类不是构造函数的 noexcept,那将是避免构造函数的 noexcept 的原因之一。
【问题讨论】:
-
基类构造失败,派生类构造能否成功?
-
没有。那么,当编译器将这一切放在一起时,它是否独立处理每个构造函数,这意味着派生类上的 noexcept 规范对编译器如何管理基构造函数没有影响?
-
实际上,我认为我的问题可能具有误导性。如果您的基类是
vector并且您将其传递给零大小,您实际上可以保证不会抛出异常。同样,noexcept表示不能抛出某些东西,以免调用abort()(我认为,请参阅文档)。因此,如果基础构造函数还不是noexcept,则必须将其包裹在try-catch中,但它可以满足noexcept保证。 -
我想问我问题的更好方法是:异常接下来会去哪里?如果基类构造函数抛出异常,是转到派生类构造函数还是调用该构造函数的代码?
-
@UlrichEckhardt 如果基类构造函数抛出异常,派生类构造函数实际上不可能“吞下”该异常:派生构造函数必须抛出或程序必须终止。