Три различных компилятора показывают три различных поведения, компилирующих этот код:
class MyException : public std::exception
{
public:
MyException(std::string str) : m_str(str) {}
virtual const char * what() const throw () {return m_str.c_str(); }
protected:
std::string m_str;
};
Sun C ++ 5.8 Patch 121017-22 2010/09/29: Предупреждение Функция MyException :: ~ MyException () может выдавать только исключения, выданные функцией std :: exception :: ~ exception (), которую он переопределяет
g ++ 3.4.3: Ошибка более слабый спецификатор броска для `virtual MyException :: ~MyException () '
Visual Studio 2005: Очень рад (ни об ошибке, ни предупреждении)
class exception {
public:
exception () throw();
exception (const exception&) throw();
exception& operator= (const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
}
Я знаю, в чем проблема и как я могу ее исправитьit:
class MyException : public std::exception
{
public:
MyException(std::string str) : m_str(str) {}
virtual const char * what() const throw () {return m_str.c_str(); }
~MyException() throw() {} <------------ now it is fine!
protected:
std::string m_str;
};
Однако мне интересно, что говорит стандарт в конкретной ситуации.
Я провел еще один небольшой тест в Visual Studio 2005 и обнаружил кое-что, чтоменя действительно удивляет:
struct Base
{
virtual int foo() const throw() { return 5; }
};
struct Derived : public Base
{
int foo() const { return 6; }
};
int main()
{
Base* b = new Derived;
std::cout << b->foo() << std::endl; //<-- this line print 6!!!
delete b;
}
Подпись двух функций различна.Как это может работать?Кажется, что Visual Studio 2005 полностью игнорирует спецификацию исключений.
struct Base
{
virtual int foo() const throw() { return 5; }
};
struct Derived : public Base
{
int foo() { return 6; } // I have removed the const keyword
// and the signature has changed
};
int main()
{
Base* b = new Derived;
std::cout << b->foo() << std::endl; // <-- this line print 5
delete b;
}
Это стандарт c ++?Можно ли установить какой-либо магический флаг?
А как насчет VS2008 и VS2010?