#include <iostream>
class XX
{
public:
XX() {std::cout<<"C XX\n";}
private:
~XX() {std::cout<<"~ XX\n";}
};
int main() {
XX *xx=new XX[10]; // compile error (1)
XX x_auto; // compile error (2)
XX *xx=new XX; // ok (3)
delete xx; // compile error (4)
return 0;
}
Есть гипотезы.
(1) - ошибка, ибо в случае исключения в конструкторе XX() при конструировании 5-го элемента, компилятор должен будет вызвать (сгенерить код вызова) деструктора ~XX() для предыдущих 4 успешно сконструированных объектов и не сможет этого сделать по причине приватности сего деструктора. Вероятность сего исключения невозможно понять на этапе компиляции, поэтому такое запрещено.
(2) - ошибка, ибо объект x_auto - автоматический (на стеке), что означает неизбежность вызова его деструктора, что невозможно из-за приватности сего деструктора.
(3) - ОК, т.к. возможное исключение из конструктора не сопровождается вызовом никаких деструкторов, а программист может деструктор вообще не вызывать, ибо объект не автоматический.
(4) - ошибка, не могу вызвать деструктор - его нет (приватный, наружу не торчит).