C++ C++;编译“运算符删除”时编译器是否工作?

C++ C++;编译“运算符删除”时编译器是否工作?,c++,compilation,C++,Compilation,我注意到gcc sourcegcc/libstdc++-v3/libsupc++/new目录中的delete声明是 void operator delete(void*) void operator delete[](void*) 为什么我们可以将const ptr传递给操作员 const int* a = new int(1); delete(a); 我认为void*和const int*是不兼容的类型。你是对的。通常,const int*不能隐式转换为vo

我注意到gcc source
gcc/libstdc++-v3/libsupc++/new
目录中的
delete
声明是

    void operator delete(void*)
    void operator delete[](void*)
为什么我们可以将
const ptr
传递给操作员

    const int* a = new int(1);
    delete(a);

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

你是对的。通常,
const int*
不能隐式转换为
void*
(为了尊重const的正确性)

但是,从标准[expr.delete]:

[注意:指向常量类型的指针可以是delete表达式的操作数;在用作delete表达式的操作数之前,无需丢弃指针表达式的常量。 -尾注 ]

换句话说,编译器会自动处理表达式
delete expr
,以确定常量的正确性

不同的情况,例如,如果您尝试直接调用函数,例如:

::operator delete(p);

注意和之间的区别。构造/破坏不受限制。考虑<代码> const fo fo;
,其中
Foo
是对象类类型。结果是一个
foo
,您只能访问
const
成员。对象本身仍然是可构造的,并且也必须是可破坏的。你动态地做这件事是唯一的区别。编辑:你的问题很确定。谢谢你的回答。你能解释一下编译器“如何处理
const
qualifier”吗?把它当作特例扔掉?或者在
delete
const
之间存在某种优先级机制?
const
属性只是编译器解析的人工构造。对于
delete
表达式,编译器只需忽略
const