В чем смысл удалённого деструктора?
Я сталкиваюсь с правилом (раздел N3797::12.8/11 [class.copy]
)
Неявно объявленный конструктор копирования/перемещения является встроенным общедоступным член его класса. Конструктор копирования/перемещения по умолчанию для класса X определяется как удаленный (8.4.3), если X имеет:
[...]
- любой прямой или виртуальный базовый класс или нестатический член данных типа с деструктором, который удален или недоступен по умолчанию конструктор или
[...]
Но я не могу получить точку удалённого деструктора, появляющуюся в виртуальном или прямом базовом классе вообще. Рассмотрим следующий простой пример:
struct A
{
~A() = delete;
A(){ }
};
struct B : A
{
B(){ }; //error: use of deleted function 'A::~A()'
};
B b;
int main() { }
DEMO
Мне это совершенно непонятно. Я определил конструктор 0-аргументов explcitly и не использует деструктор базового класса. Но компилятор думает иначе. Это не сработает, даже если мы явно определяем деструктор B
:
struct A
{
~A() = delete;
A(){ }
};
struct B : A
{
B(){ };
~B(){ };
};
//B b;
int main() {
}
DEMO
Не могли бы вы прояснить эту вещь?
Ответы
Ответ 1
Обоснование этой пули описано в отчет о дефектах 1191: Удаленные деструкторы субобъектов и неявно определенные конструкторы, в которых говорится:
Рассмотрим следующий пример:
struct A {
A();
~A() = delete;
};
struct B: A { };
B* b = new B;
В соответствии с действующими правилами B() не удаляется, но плохо сформирован, потому что он вызывает удаленный ~ A:: A(), если он выходит из исключения после завершение построения A. Удаленный подобъект-деструктор следует добавить в список причин неявного удаления в 12.1 [class.ctor] и 12.8 [class.copy].
и предлагаемая резолюция заключалась в том, чтобы добавить отмеченную выше марку и ту же формулировку в следующий раздел 12.1
[class.ctor], пункт 5:
любой прямой или виртуальный базовый класс или нестатический член данных имеет тип с деструктором, который удален или недоступен из стандартного конструктора по умолчанию.