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