предположим, что код выполняет следующие действия:
T *pointer = new T(); delete static_cast<void*>(pointer);
каков результат? Не определено, утечка памяти, память удалена?
Поведение не определено. Что касается выражения удаления, стандарт C ++ гласит:
В первом альтернативном варианте ( удалить объект ), если статический тип операнда отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь виртуальный деструктор или поведение не определено. Во втором альтернативном варианте ( delete array ), если динамический тип удаляемого объекта отличается от его статического типа, поведение не определено. (§5.3.5 / 3)
Тогда в сноске к этому абзацу четко говорится:
Это означает, что объект нельзя удалить с помощью указателя типа void*, поскольку нет объектов типа void (примечание 73).
void*
void
Удаление через указатель void не определено, как и все остальное через указатель void, кроме явного преобразования его в указатель другого типа.