C++ C++;编译“运算符删除”时编译器是否工作?
我注意到gcc sourceC++ 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/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
。