Почему деструктор базового класса должен быть доступен только тогда, когда объявлен пользовательский конструктор?

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 ++

16
задан Community 23 May 2017 в 12:11
поделиться