Допустим, никому не скучно, и он вручную вызывает деструктор для какого-либо указателя.
Я думаю, вы слишком быстро отказались от этой возможности.Встраиваемые системы / системы с ограниченным объемом памяти, где динамическое выделение запрещено, все еще могут создавать объекты с динамическим хранением длительность .Обратите внимание:
alignas(T) char memory[sizeof(T)];
T *p = new(memory) T; //Does not call global `new` allocator.
/*do stuff with `p`*/
p->~T();
Нет причин запрещать это.Действительно, некоторые реализации стирания типов полагаются на это при оптимизации небольших объектов.Реализации std::any
для небольших объектов могут создавать производный класс полностью, используя память в самом объекте std::any
.Но все равно необходимо вызвать деструктор типа, обычно через указатель базового класса.Существуют реализации any
, которые не , конечно, не используют наследование, но в целом я хочу сказать, что было бы странно прямо запретить вызов деструктора вручную.