Ars Longa, Vita Brevis

Имеется кусок кода:

[-]
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;
}

При компиляции в 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 ()

Самое интересное, что если сделать Derived::s типа, например, int, то ошибка исчезнет.

В чем же дело? Читать статью «GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора» полностью…