спецификация исключения gcc для деструктора по умолчанию

class A
{
    public:
    virtual ~A()
    {
    }
};

class B : virtual public A
{
    public:
    ~B() throw()
    {}
};

class C : public B
{
};

int main(int argc, char * argv [])
{
return 0;
}

Этот код дает следующую ошибку:

error: looser throw specifier for ‘virtual C::~C()’
error:   overriding ‘virtual B::~B() throw ()’

при моем тестировании debian (gcc (Debian 4.6.0-10) 4.6.1 20110526 (предварительная версия)), но компилируется без ошибок в предыдущих версиях gcc (4.5 на снова моя система Debian).

Как спецификация исключения влияет на переопределение виртуального деструктора? В соответствии с этим ответом компилятор должен создать конструктор по умолчанию, соответствующий объявлению throw базового класса. Очевидно, что это не то, что происходит с новым gcc. Что изменилось, каково правильное поведение компилятора и есть ли какое-нибудь простое решение проблемы, кроме добавления вручную пустых деструкторов в производные классы (например, флаг компилятора).

8
задан Community 23 May 2017 в 11:59
поделиться