C++编译器在编译`operator delete`时是如何工作的?

4

我注意到gcc源代码目录下gcc/libstdc++-v3/libsupc++/newdelete的声明为:

    void operator delete(void*)
    void operator delete[](void*)

为什么我们可以将const ptr传递给运算符?
    const int* a = new int(1);
    delete(a);

我认为void*const int*是不兼容的类型。


1
注意delete expressionoperator delete之间的区别。 - Daniel Langr
构造/析构不受const限制。考虑const Foo foo;,其中Foo是一个对象类类型。结果是一个foo,你只能访问const成员。对象本身仍然可以构造,并且必须可析构。你正在动态地执行这个操作,这确实是唯一的区别。编辑:我很确定这是你问题的重复 - WhozCraig
1个回答

5
你说得对。通常情况下,const int* 不能隐式转换为 void* (以保持 const-correctness)。
然而,根据标准文献 [expr.delete]

[注意:指向 const 类型的指针可以是 delete 表达式的操作数;在将指针表达式用作 delete 表达式的操作数之前,不必去除指针表达式的 const 属性。 ——末尾注释 ]

换句话说,编译器会自动处理 表达式 delete expr,并考虑到 const-correctness
不过,如果直接调用函数,情况就不同了,例如:
::operator delete(p);

谢谢您的回答。您能否更详细地解释一下编译器如何“处理const限定符”?只是将其作为特殊情况丢弃吗?还是deleteconst之间有一些优先级机制? - cnby
const 属性只是编译器解析的人工构造。在 delete 表达式中,编译器会忽略 const - BiagioF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接