Подтвердить что ты не робот

Почему VС++ C4150 (удаление указателя на неполный тип) только предупреждение?

Конечно, предупреждение должно обрабатываться, но почему VС++ C4150 (удаление указателя на неполный тип) только предупреждение?

4b9b3361

Ответ 1

Потому что стандарт говорит, что он легален, хотя и опасен: 5.3.5

Если удаляемый объект имеет неполный тип класса в точке удаление, а полный класс имеет нетривиальный деструктор или функция освобождения, поведение undefined.

Ответ 2

Вы получаете это предупреждение как результат форвардного объявления. Поэтому компилятор признал, что это структура/класс, но не уверен в вызове деструктора.

Смысл предупреждения, который наиболее вероятен, касается второго прохождения анализа кода с помощью msvc. Когда последний класс разрешен, компилятор может принять решение, если существует деструктор.

Ответ 3

Это законно на С++, хотя часто достаточно плохая идея.

Грубо говоря, уровень предупреждения 1 - это "вы можете быть удивлены, но я проигнорировал то, что вы сказали там", и несколько выбранных операторов, в которых сгенерированный код, скорее всего, неверен и подвержен ошибкам.

Таким образом, WL 2 подходит, поскольку он закончен и во многих сценариях полностью подходит для удаления неполного типа.

Конечно, это рассуждение - это всего лишь образованная догадка. Возможно, Microsoft перевернула кости, чтобы присвоить этот уровень предупреждения.