Looser Throw Specifier в С++

Что означает эта ошибка? Как я могу это исправить? Это код заголовка, который вызывает его:

class BadJumbleException : public exception {
public:
    BadJumbleException (const string& msg); // Constructor, accepts a string as the message
    string& what();                         // Returns the message string
private:
    string message;                         // Stores the exception message
};

И это исходный код:

BadJumbleException::BadJumbleException (const string& m) : message(m) {}
string& BadJumbleException::what() { return message; }

EDIT: Это ошибка:

looser throw specifier для 'virtual BadJumbleException:: ~ BadJumbleException()

Ответ 1

В С++ 03, per & sect; 18.6.1/5, std::exception имеет деструктор, объявленный таким образом, что из него не могут быть исключены исключения (будет вызвана ошибка компиляции).

Язык требует, чтобы, когда вы выходите из такого типа, ваш собственный деструктор должен иметь такое же ограничение:

virtual BadJumbleException::~BadJumbleException() throw() {}
//                                                ^^^^^^^

Это связано с тем, что переопределяющая функция может не иметь спецификации looser throw.


В С++ 11, std::exception::~exception не помечен throw() (или noexcept) явно в коде библиотеки, но все деструкторы по умолчанию noexcept(true).

Поскольку это правило будет включать ваш деструктор и позволить вашей программе компилироваться, это приводит меня к выводу, что вы на самом деле не компилируете как C + +11.

Ответ 2

Я получал подобное исключение для одного из моих примеров кода. Я пытался реализовать это в С++ 14. Вот реализация:

class BadJumbleException : public std::exception {
    public:
        BadJumbleException(const std::string& m_) : msg(m_) {}
        virtual ~BadJumbleException() {}

        virtual const char * what() const throw() {
            return msg.c_str();
        }

    private:
        const std::string msg;
};