Этот код вызывает неопределенное поведение (UB). Это UB в C ++ к delete
объекту неполного типа, имеющему нетривиальный деструктор. И в вашем коде тип SomeClass
является неполным в точке delete
и имеет нетривиальный деструктор. Компиляторы обычно выдают предупреждение об этом, поскольку формально в C ++ это не является нарушением ограничения.
Так что, строго говоря, ваш код не "работает". Он просто компилирует и делает что-то undefined при запуске.
Компилятору просто не требуется отлавливать эту ошибку. Причина в том, что это может быть совершенно нормально, если у вашего объекта есть деструктор тривиальный . Компилятор не может знать, какой тип деструктора будет в конечном итоге иметь этот тип, поэтому он не может точно сказать, является ли это ошибкой.