为什么删除不完整类型的对象会被定义为“未定义行为”?
来自C++规范; §5.3.5/5;
如果要删除的对象在删除点具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为是未定义的。
给定以下代码示例(我理解为什么这是一个错误);
为什么在gcc、clang和msvc上都会警告不完整类型的情况下,它被定义为“未定义行为”?为什么不直接在那个点上报错,即为什么它不是可诊断错误?
来自C++规范; §5.3.5/5;
如果要删除的对象在删除点具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为是未定义的。
给定以下代码示例(我理解为什么这是一个错误);
class ABC;
int main()
{
ABC* p = nullptr;
delete p;
}
为什么在gcc、clang和msvc上都会警告不完整类型的情况下,它被定义为“未定义行为”?为什么不直接在那个点上报错,即为什么它不是可诊断错误?