C++ 为什么VC++;C4150(删除指向不完整类型的指针)仅警告?

C++ 为什么VC++;C4150(删除指向不完整类型的指针)仅警告?,c++,compiler-construction,visual-c++,compiler-warnings,C++,Compiler Construction,Visual C++,Compiler Warnings,当然,必须处理警告,但是为什么VC++(删除指向不完整类型的指针)只是一个警告?转发声明会导致此警告。所以编译器已经认识到它是结构/类,但不确定析构函数的调用 警告感最可能与msvc第二次代码分析有关。当后一类被解析时,编译器可以做出析构函数存在的判定。 < P>在C++中是合法的,即使经常是一个坏主意。p> 大致上,警告级别1属于“您可能会感到惊讶,但我忽略了您在那个里说的话”类型,以及一些选定的语句,其中生成的代码很可能不正确并且容易崩溃 所以WL2是合适的,因为它是合法的,并且在许多情况下

当然,必须处理警告,但是为什么VC++(删除指向不完整类型的指针)只是一个警告?

转发声明会导致此警告。所以编译器已经认识到它是结构/类,但不确定析构函数的调用


警告感最可能与msvc第二次代码分析有关。当后一类被解析时,编译器可以做出析构函数存在的判定。

< P>在C++中是合法的,即使经常是一个坏主意。p> 大致上,警告级别1属于“您可能会感到惊讶,但我忽略了您在那个里说的话”类型,以及一些选定的语句,其中生成的代码很可能不正确并且容易崩溃

所以WL2是合适的,因为它是合法的,并且在许多情况下删除一个不完整的类型是完全可以的


当然,这种推理只是一种有根据的猜测。也许微软掷骰子来指定这个警告级别

因为标准说这是合法的,尽管很危险:5.3.5

如果要删除的对象已删除 不完整的类类型在 删除,并且完整的类具有 非平凡析构函数或 解除分配函数,行为为 未定义


可能是微软掷骰子指定了这个警告级别。
:D。。。这意味着当类型的析构函数是平凡的时,它是合法的。由于编译器不知道类型,因此它不知道析构函数是否平凡,也无法确定行为是否未定义。