Почему исключение неполного типа определяется как «неопределенное поведение»?Почему исключение неполного типа определяется как «неопределенное поведение»?
Из спецификации C++; §5.3.5/5;
Если объект удаляются имеет неполный тип класса в точке удаления, а полный класс имеет нетривиальный деструктор или функцию Deallocation, поведение не определенно.
Учитывая пример кода (я понимаю, почему это ошибка);
class ABC;
int main()
{
ABC* p = nullptr;
delete p;
}
Почему определяется как быть определено поведение при НКУ, лязг и MSVC все предупреждают о его будучи неполным типа? Почему не просто ошибка в этой точке, то есть Почему это не диагностическая ошибка?
Возможный дубликат [Почему, действительно, удаление неполного типа является неопределенным поведением?] (Http://stackoverflow.com/questions/2517245/why-really-deleting-an-incomplete-type-is-undefined-behaviour) – CoryKramer
@Cyber. Вот почему это ошибка. Я хочу знать, почему это было определено как «неопределенное поведение» - почему компилятор не обязан отказываться от компиляции? – Niall
Проблема может быть поднята для любого метода в объявленном, но еще неопределенном классе. Однако компилятор знает, что деструктор существует и может иметь определенное определение (тривиальное), в отличие от любого другого произвольного метода. Единственное, что пока не известно, будет ли деструктор виртуальным или нет, что может изменить соглашение о вызове (этот вопрос подкрепляется ответом на другой вопрос). – didierc