Noexcept对派生类构造函数的承诺:可以在不对基础构造函数作出诺言的情况下使用吗?

rsjaffe

假设我有一堂课

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

默认情况下继承构造函数noexcept(true)吗?

派生类的构造函数可以比其基类的构造函数具有更多的参数吗?

从虚拟基础派生类,没有默认构造函数

C ++的类变量可以在没有Java构造函数的情况下初始化吗?

如果基类构造函数不是constexpr,我可以使派生类的构造函数constexpr吗?

我可以从基类调用派生类构造函数吗?

C++ 可以根据给单个构造函数的参数创建派生类而不是bass 类吗?

从派生类构造函数调用基类构造函数

是否可以从基类构造函数调用派生类构造函数?

C ++-派生类构造函数的行为

派生类中的重载构造函数

移动派生类的构造函数

从派生类调用构造函数

python派生类构造函数

在派生类中强制使用受保护的构造函数

使用CRTP时如何调用派生类的构造函数?

使用派生类作为模板构造函数

在基类构造函数中使用派生类属性

是否可以从派生类的默认构造函数将参数传递给基本构造函数?

使用Java Reflection,如何获取指定构造函数args派生类的类的构造函数?

我可以在父级没有子级构造函数的情况下添加子级构造函数吗?

C#根据参数类型实例化基础构造函数的派生类

在某些枚举的模板情况下启用类构造函数

基类构造函数在未指定的情况下运行

默认情况下,构造函数是公共的吗?

我可以在不实现子构造函数的情况下创建Perl子类吗?

可以在没有私有构造函数的情况下创建单例吗?

有没有一种方法可以在没有虚拟的情况下使用基类指针来调用派生类函数

如何使用指向函数的指针在基类构造函数中调用派生类的方法?