我无法理解为 void* == nullptr 调用 operator delete 的标准需要做什么。
像这样的东西:
void foo(void* ptr) // ptr == nullptr here
{
delete ptr;
}
一方面,我们在标准中有以下声明:
ISO/IEC 14882:2011
5.3.5 删除[expr.delete]
1 ...操作数应具有指向对象类型的指针,或具有指向对象类型指针的单个非显式转换函数(12.3.2)的类类型。结果的类型为 void.78
78)这意味着不能使用 void* 类型的指针删除对象,因为 void 不是对象类型。
这使得删除 void* 的代码格式不正确。另一方面,我们在 delete 中有另一个关于 nullptr 的声明:
ISO/IEC 14882:2011
5.3.5 删除[expr.delete]
2 ... 在第一种选择(删除对象)中,delete 的操作数的值可以是空指针值,指向由先前的 new 表达式创建的非数组对象的指针,或指向子对象的指针 ( 1.8) 表示此类对象的基类(第 10 条)。如果不是,则行为未定义。在第二种选择(删除数组)中,delete 的操作数的值可能是空指针值或前一个数组 new-expression 产生的指针值。79 如果不是,则行为未定义。
在这种情况下需要做什么实施?