Три разных компилятора показывают три разных поведения, компилирующих этот код:
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 С++ 5.8 Патч 121017-22 2010/09/29: Предупреждение Функция MyException:: ~ MyException() может вызывать только исключения, исключаемые функцией std:: exception:: ~ exception ( ) он переопределяет
g++ 3.4.3: Ошибка спецификатор looser throw для `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();
}
Я знаю, в чем проблема и как я могу это исправить:
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;
}
Является ли это стандартом С++? Есть ли какой-либо волшебный флаг для установки?
Что относительно VS2008 и VS2010?