首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确解析与隐式虚析构函数不兼容的抛出说明符?

如何正确解析与隐式虚析构函数不兼容的抛出说明符?
EN

Stack Overflow用户
提问于 2013-06-24 18:22:46
回答 1查看 2.3K关注 0票数 8

此代码无法编译:

代码语言:javascript
复制
#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;
}

错误是:

代码语言:javascript
复制
error: looser throw specifier for 'virtual Derived::~Derived()'
error:   overriding 'virtual Base::~Base() noexcept (true)'

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

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

起初,我认为可以通过将两个析构函数都声明为noexcept(false)来解决这个问题

代码语言:javascript
复制
virtual ~Base() noexcept(false) = default;
virtual ~Derived() noexcept(false) = default;

但我得到的只是:

代码语言:javascript
复制
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)'

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 18:40:48

你似乎被你的QString给冲了,它指定了自己的数据类型。

我看不到简单的解决办法(除了使用合理的字符串):您可以随意指定您的基类dtor为noexcept(false),或者显式地派生dtor并表达noexcept(true)。(我不确定如果~QString真的抛出了,会不会有什么好的事情发生,但这会导致第一个转义路径)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17273165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档