此代码无法编译:
#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
这是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)'
我不在代码中的任何地方使用异常,所以我正在寻找的只是一个“修复”。
你似乎被你的 QString 淹没了,它指定自己抛出 dtor 。
我认为没有简单的方法(除了使用合理的字符串之外):您也可以将基类 dtor 指定为 noexcept(false) ,或者使 Derived dtor 显式并表达 noexcept(true) 。 (我不确定如果 ~QString 实际上抛出,是否会发生任何好事,但这会导致第一个逃生路线)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)