#include <iostream>

struct ICantChange
{
    virtual ~ICantChange() {}
};

struct ClassThatThrows
{
    virtual ~ClassThatThrows() noexcept(false)
    {
        throw 44;
    }
};

struct Test : ICantChange
{
    ~Test()
    {
    }
    ClassThatThrows instance;
};

main()
{
    try
    {
        Test obj;
    }
    catch(int except)
    {
        std::cout << "caught" << std::endl;
    }
}

此代码给出错误消息:
main.cpp:20:5: error: looser throw specifier for ‘virtual Test::~Test() noexcept (false)’
     ~Test()
     ^
main.cpp:6:13: error:   overriding ‘virtual ICantChange::~ICantChange() noexcept’
     virtual ~ICantChange() {}

要修复该错误,我看到的唯一选择是将noexcept(false)添加到我无法创建的ICantChange类的析构函数中,因为它是库类。

我知道抛出析构函数是不好的,但是现在我有了Test类,我想捕获被破坏时抛出的异常。

谁能提出解决方案?

最佳答案

您遇到的问题是析构函数或noexcept(true),因此通过添加一个成员noexcept(false),您正在兑现 promise 。

但是不要抛出析构函数:throwing exceptions out of a destructor

10-08 08:21