Ошибка компилятора: более слабый спецификатор броска для деструктора - PullRequest
0 голосов
/ 23 октября 2018
#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 класс, и я хочу ловить исключения, которые выбрасываются при его разрушении.

Может кто-нибудь предложить решение

1 Ответ

0 голосов
/ 23 октября 2018

У вас проблема с этим деструктором или noexcept(true), поэтому, добавив члена с noexcept(false), вы нарушаете это обещание.

Но не добавляйте деструкторов: throwingисключения из деструктора

...