2014-11-15 2 views
4

я сталкиваюсь правилу (раздел N3797::12.8/11 [class.copy])Какой смысл удалить деструктор?

Для неявно объявленных копировать/перемещать конструктор инлайн общественного члена своего класса. Дефолте конструктор копирования/перемещения для класса X определяется как удаленные (8.4.3), если X имеет:

[...]

- любой прямой или виртуальный базовый класс или не статический член данных типа с деструктора, который является удален или недоступен из дефолте конструктора или

[...]

Но я не могу получить точку удаляемого г estructor, появляющийся в виртуальном или прямом базовом классе вообще. Рассмотрим следующий простой пример:

struct A 
{ 
    ~A() = delete; 
    A(){ } 
}; 

struct B : A 
{ 
    B(){ }; //error: use of deleted function 'A::~A()' 
}; 

B b; 

int main() { } 

DEMO

Это совершенно неясно мне. Я определил конструктор 0-аргументов explcitly и не использует деструктор базового класса. Но компилятор думает иначе. Это не будет работать, даже если мы определим деструктор B «s явно:

struct A 
{ 
    ~A() = delete; 
    A(){ } 
}; 

struct B : A 
{ 
    B(){ }; 
    ~B(){ }; 
}; 

//B b; 

int main() { 
} 

DEMO

Не могли бы вы уточнить, что вещь?

+0

Связанный: [Как = удаление на деструктор предотвращает выделение?] (Http://stackoverflow.com/questions/18847739/how-does-delete-on-destructor-prevents-allocation) – Nawaz

+0

@RaphaelM. Да, переменные со статическим временем хранения будут уничтожены после возврата из основной функции. Ясно. Так в чем смысл таких деструкторов? –

+0

@Nawaz Но в моем втором примере я никогда не выделяю переменную. –

ответ

1

Обоснованием для этой пули кроется в defect report 1191: Deleted subobject destructors and implicitly-defined constructors, который говорит:

Рассмотрим следующий пример:

struct A { 
    A(); 
    ~A() = delete; 
}; 

struct B: A { }; 
B* b = new B; 

В соответствии с действующими правилами, B() не удаляется, но жестокого потому что вызывает удаленный ~ A :: A(), если он выходит из исключения после завершения построения A. Удаленный субобъект подобъекта следует добавить в список причин неявного удаления в 12.1 [класс.ктор] и 12.8 [класс.copy].

и предлагаемое решение было добавить пулю вы примечание выше и ту же формулировку в следующем разделе 12.1 [class.ctor] пункт 5:

любой прямой или виртуального базового класса или не- член статических данных имеет тип с деструктором, который удален или недоступен из стандартного конструктора по умолчанию.

+0

Позвольте мне спросить, используете ли вы удаленный деструктор самостоятельно? –

+0

А, я понял. Спасибо за ссылку на этот вопрос, было очень полезно. –

Смежные вопросы