Конечно, предупреждение должно обрабатываться, но почему VС++ C4150 (удаление указателя на неполный тип) только предупреждение?
Почему VС++ C4150 (удаление указателя на неполный тип) только предупреждение?
Ответ 1
Потому что стандарт говорит, что он легален, хотя и опасен: 5.3.5
Если удаляемый объект имеет неполный тип класса в точке удаление, а полный класс имеет нетривиальный деструктор или функция освобождения, поведение undefined.
Ответ 2
Вы получаете это предупреждение как результат форвардного объявления. Поэтому компилятор признал, что это структура/класс, но не уверен в вызове деструктора.
Смысл предупреждения, который наиболее вероятен, касается второго прохождения анализа кода с помощью msvc. Когда последний класс разрешен, компилятор может принять решение, если существует деструктор.
Ответ 3
Это законно на С++, хотя часто достаточно плохая идея.
Грубо говоря, уровень предупреждения 1 - это "вы можете быть удивлены, но я проигнорировал то, что вы сказали там", и несколько выбранных операторов, в которых сгенерированный код, скорее всего, неверен и подвержен ошибкам.
Таким образом, WL 2 подходит, поскольку он закончен и во многих сценариях полностью подходит для удаления неполного типа.
Конечно, это рассуждение - это всего лишь образованная догадка. Возможно, Microsoft перевернула кости, чтобы присвоить этот уровень предупреждения.