Имеется кусок кода:
[-]
View Code C++
#include <string>
class Base {
public:
Base(void) {}
virtual ~Base(void) throw() {}
};
class Derived : public Base {
public:
::std::string s;
};
int main(int, char**)
{
return 0;
}
class Base {
public:
Base(void) {}
virtual ~Base(void) throw() {}
};
class Derived : public Base {
public:
::std::string s;
};
int main(int, char**)
{
return 0;
}
При компиляции в GCC выдает интересную ошибку:
[-]
View Code Bash
g++ test.cpp
test.cpp:9: error: looser throw specifier for ‘virtual Derived::~Derived()’
test.cpp:6: error: overriding ‘virtual Base::~Base() throw ()’
test.cpp:9: error: looser throw specifier for ‘virtual Derived::~Derived()’
test.cpp:6: error: overriding ‘virtual Base::~Base() throw ()’
Самое интересное, что если сделать Derived::s типа, например, int, то ошибка исчезнет.
В чем же дело? Читать статью «GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора» полностью…
