более слабый спецификатор броска для виртуальной функции: GCC 4.9 жалуется, но MSVC - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть оригинальный код C ++ 11, который был разработан для Windows и может быть скомпилирован MSVC:

 class Base
{
    virtual void myFunc() throw (std::runtime_error) = 0;
};

class D1 : public Base
{
    void myFunc() throw(std::runtime_error) override
    { //
        throw std::runtime_error("This method is not supported in this class so we throw exeception");
    }
};

class D2 : public D1
{
    void myFunc() override
    {
        //real implementation here
    }
};

Код перенесен в Linux и скомпилирован с GCC 4.9 Я получил ошибку

спецификатор более свободного броска для 'virtual void idcsim :: D2 :: myFunc ()'

Добавление 'throw ()' в D2 ::MyFunc код может быть скомпилирован, но это не ожидаемое свойство для MyFunc.
Есть ли способ заставить это работать для GCC?

1 Ответ

0 голосов
/ 11 декабря 2018

GCC правильно;Виртуальная функция в производном классе не может иметь более слабого спецификатора исключения, чем функция, переопределяемая в базовом классе.Причина довольно ясна: если это было разрешено, вызывающая сторона может вызывать переопределяющую функцию через указатель базового класса, таким образом, получение функции не учитывает контракт исключения из статического типа, через который она вызывается.

В MSVC это работает только потому, что его поддержка спецификаторов исключений чрезвычайно ограничена - он фактически анализирует только throw(), все остальные описатели исключений просто игнорируются.

Теперь, учитывая, что спецификаторы исключений, кромеthrow() (AKA nothrow):

  • игнорируются в MSVC.
  • все равно не рекомендуется использовать стандарт.
  • широко расценивается как ошибка, посколькуони покупают вам практически нулевую безопасность во время компиляции - они сводятся к тому, чтобы обернуть все аннотированные функции большим try и вызывать std::unexpected, если выбрасывается что-то неожиданное, - и даже для проверенных исключений в стиле Java это широко обсуждаетсяесли проблема действительно того стоит;

вам, вероятно, следует отказаться отм в целом и никогда не оглядывайся назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...