Ответ 1
Я подозреваю, что это может быть поведение, специфичное для компилятора. Вот моя теория:
Поскольку (в данном конкретном случае) неявно определенный 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'