首页 > 解决方案 > 具有 noexcept(false) 的析构函数的类可以从具有 noexcept(true) 的析构函数的基类继承吗

问题描述

场景就像,我想从一些第三方库类继承我的类,其析构函数默认为 noexcept(true)。派生类的析构函数为 noexcept(false),因为它可以抛出异常。有以下代码:

class 3PP
{
public:
  virtual ~3PP() {}
};

class B : public 3PP
{
public:
  ~B() noexcept(false)
};

我在编译时收到此错误。

 error: looser throw specifier for ‘virtual B::~B() noexcept (false)’
 class B : public 3PP
       ^
main.cpp:10:11: error:   overriding ‘virtual 3PP::~3PP() noexcept’
   virtual ~3PP() {}

有没有办法从 3PP 类继承它而不使其析构函数 noexcept(false)

我也想了解将析构函数设为 noexcept(false) 的限制。

标签: c++destructornoexcept

解决方案


具有 noexcept(false) 的析构函数的类可以从具有 noexcept(true) 的析构函数的基类继承吗

是的。以下程序格式正确:

struct B {
    ~B() noexcept        = default;
};

struct D : B {
    ~D() noexcept(false) = default;
};

但是,如果基函数为 noexcept,则可能不会抛出虚函数的覆盖。因此,如果 base 有一个虚拟的noexcept 析构函数,你就不能有一个潜在的抛出析构函数。


推荐阅读