Это неопределенное поведение.
Однако вы можете проверить компилятором неполные типы, такие как boost:
// verify that types are complete for increased safety
template<class T> inline void checked_delete(T * x)
{
// intentionally complex - simplification causes regressions
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete x;
}
Применение sizeof
к неполному типу должно вызвать ошибку, и я предполагаю, что если это пройдет с каким-то компилятором, то массив отрицательного размера вызовет ошибку.