Comeau, g ++ ( ideone ) и EDG принимают следующий код без диагностики. Visual C ++ успешно компилируется, хотя и с предупреждением C4624.
class indestructible_base
{
~indestructible_base();
};
class T : indestructible_base
{
public:
//T() {}
};
int main(void) { new T(); }
Раскомментируйте конструктор, и он больше не будет компилироваться.
Может быть, это правило, что если внутри конструктора возникает исключение, подобъекты должны быть уничтожены? Кажется странным, поскольку тело пусто и не может вызвать исключения. Тем не менее, добавьте спецификацию исключения, подтверждающую тот факт, что исключение не будет сгенерировано ( throw ()
или noexcept
), и это не имеет значения.
Почему объявленный пользователем конструктор требует доступа к деструктору базового класса, а автоматически сгенерированный конструктор - нет?
На этот вопрос возник вопрос: Предотвращение запуска деструктора в C ++