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
), и это не имеет значения.
Почему конструктор, объявленный пользователем, требует доступа к деструктору базового класса, в то время как конструктор, созданный автоматически?
Этот вопрос был вдохновлен: Preventing a Destructor from Running in C++
FWIW, Clang отклоняет программу в обоих случаях в режиме C++ 0x, но ведет себя как g ++ в режимах C++ 98. – justin
, когда вы объявляете ~ indestructible_base() как общедоступный, компилятор не жалуется. – haberdar
Это может иметь отношение к исключениям. Если есть определенный пользователем конструктор, нет никакой гарантии, что он не будет бросать. Если он выбрасывает, базовый подобъект необходимо уничтожить. Но я могу ошибаться. - Он также не будет компилироваться даже без определяемого пользователем конструктора, если у вас нетривиальный член, например std :: string. (Опять же, это может вызвать конструктор, сгенерированный компилятором.) – visitor