我注意到gcc源代码目录下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*
是不兼容的类型。
我注意到gcc源代码目录下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-correctness)。换句话说,编译器会自动处理 表达式[注意:指向 const 类型的指针可以是 delete 表达式的操作数;在将指针表达式用作 delete 表达式的操作数之前,不必去除指针表达式的 const 属性。 ——末尾注释 ]
delete expr
,并考虑到 const-correctness。::operator delete(p);
const
限定符”?只是将其作为特殊情况丢弃吗?还是delete
和const
之间有一些优先级机制? - cnbyconst
属性只是编译器解析的人工构造。在 delete
表达式中,编译器会忽略 const
。 - BiagioF
delete
expression和operator delete
之间的区别。 - Daniel Langrconst Foo foo;
,其中Foo
是一个对象类类型。结果是一个foo
,你只能访问const
成员。对象本身仍然可以构造,并且必须可析构。你正在动态地执行这个操作,这确实是唯一的区别。编辑:我很确定这是你问题的重复。 - WhozCraig