Рассмотрим следующий текст:
[C++11: 12.4/11]:
Деструкторы вызываются неявно
- для построенных объектов со статической продолжительностью хранения (3.7.1) при завершении программы (3.6.3),
- для построенных объектов с длительностью хранения потоков (3.7.2) при выходе потока,
- для построенных объектов с автоматическим временем хранения (3.7.3), когда блок, в котором создается объект, завершает (6.7),
- для построенных временных объектов, когда срок жизни временного объекта заканчивается (12.2),
- для построенных объектов, выделенных новым выражением (5.3.4), с использованием выражения-удаления (5.3.5),
- в нескольких ситуациях из-за обработки исключений (15.3).
Программа плохо сформирована, если объявлен объект класса или его массива, а деструктор для класса недоступен в точке объявления. Деструкторы также могут быть явно вызваны.
Тогда почему эта программа успешно компилируется?
#include <iostream>
struct A
{
A(){ };
~A() = delete;
};
A* a = new A;
int main() {}
// g++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
Является ли GCC просто разрешительным?
Я склонен это сказать, так как он отклоняет следующий стандарт, по-видимому, не имеет конкретного правила, специфичного для удаленных деструкторов в иерархии наследования (единственное достаточно важная формулировка относится к генерации дефолтных конструкторов по умолчанию):
#include <iostream>
struct A
{
A() {};
~A() = delete;
};
struct B : A {};
B *b = new B; // error: use of deleted function
int main() {}