8

此代码无法编译:

#include <QString>

/* relevant part:
struct QString 
{
  ~QString() noexcept(false) {};
};
*/

class Base
{
public:
    virtual ~Base() = default;
};

class Derived : public Base
{
    QString string_;
};

int main()
{
    return 0;
}

错误是:

error: looser throw specifier for 'virtual Derived::~Derived()'
error:   overriding 'virtual Base::~Base() noexcept (true)'

我没有使用异常的经验,但我认为问题在于QString析构函数没有异常说明符,因此隐式创建Derived::~Derived的也没有异常说明符。Base::~Base这与隐含的 is不兼容noexcept(true)

如果我排除QString或将其替换为带有noexcept(true)(例如std::string)的类,则代码将编译。

起初我认为我可以通过将两个析构函数声明为noexcept(false)

virtual ~Base() noexcept(false) = default;
virtual ~Derived() noexcept(false) = default;

但我得到的只是:

error: function 'virtual Base::~Base()' defaulted on its first declaration 
       with an exception-specification that differs from 
       the implicit declaration 'Base::~Base()'
error: looser throw specifier for 'virtual Derived::~Derived() noexcept (false)'
error: overriding 'virtual Base::~Base() noexcept (true)'

我不在我的代码中的任何地方使用异常,所以我正在寻找的只是一个“修复”。

4

1 回答 1

1

你似乎被你的 QString 弄得心烦意乱,它指定自己扔进 dtor。

我认为没有简单的方法(除了使用合理的字符串):您可以在风中弯曲,将您的基类 dtor 指定为 noexcept(false),或者使 Derived dtor 显式并表达 noexcept(true)。(我不确定如果 ~QString 实际抛出是否有任何好处,但这会导致第一条逃生路线)。

于 2013-06-24T10:40:48.217 回答