为什么通过 void*
删除对象会导致未定义的行为,而不是编译错误?
void foo(void* p) {
delete p;
}
这段代码可以编译并生成代码,尽管在gcc和clang上会出现警告(令人惊讶的是,ICC没有警告):
:2:5: 警告: 无法使用指向“void”类型的指针表达式删除 'void *' [-Wdelete-incomplete]
为什么它不仅仅是语法无效的拼写错误呢?看起来标准对此没有花费太多时间,在[expr.delete]
中说:
这意味着不能使用类型为void*的指针删除对象,因为void不是一个对象类型。
是否有任何我忽略的原因,使得这不会触发严格的编译错误?