Я подозреваю, что это может быть поведение, специфичное для компилятора.Вот моя теория:
Поскольку (в данном конкретном случае) неявно определенный T () является тривиальным конструктором (как определено в 12.1 (5) стандарта), компилятор недаже не пытаться сгенерировать тело для T ().Так как нет тела ctor, нет исключений, которые могли бы быть сгенерированы во время «конструирования» (которых на самом деле нет), поэтому нет необходимости генерировать вызов dtor, и, следовательно, нет необходимости генерировать тело dtorтолько для того, чтобы выяснить, что dtor базового класса является приватным.
Но как только T () становится нетривиальным (даже если он остается неявно определенным), должно быть сгенерировано тело ctor, и вы получитеОшибка.Простое добавление члена класса T с пользовательским конструктором может сделать неявно определенный T () нетривиальным.
Отдельная, но связанная проблема заключается в том, что new T()
нене генерировать вызов dtor (поскольку у вас нет соответствующего delete
где-либо).Напротив, если я просто заменю new T()
на T dummy
в вашем коде, то я получу следующее от gcc
, предполагая, что теперь он выполняет полную проверку доступности dtor (как следствие необходимости генерировать вызов dtor):
test.cpp: In destructor 'T::~T()':
test.cpp:3: error: 'indestructible_base::~indestructible_base()' is private
test.cpp:7: error: within this context
test.cpp: In function 'int main()':
test.cpp:12: note: synthesized method 'T::~T()' first required here
test.cpp:12: warning: unused variable 'dummy'