【问题标题】:How does C++ compiler work when compiling `operator delete`? [duplicate]编译 `operator delete` 时,C++ 编译器如何工作? [复制]
【发布时间】:2020-01-21 08:46:43
【问题描述】:

我注意到在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* 是不兼容的类型。

【问题讨论】:

  • 注意delete expressionoperator delete之间的区别。
  • 构造/破坏不受 const 限制。考虑const Foo foo;,其中Foo 是一个对象类类型。结果是foo,您只能访问const 成员。对象本身仍然是可构造的,也必须是可破坏的。您正在动态地进行此操作 确实是唯一的区别。编辑:很确定this is a dupe 你的问题。

标签: c++ compilation


【解决方案1】:

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

但是,从标准 [expr.delete]

[ 注意:指向 const 类型的指针可以是删除表达式的操作数;在将指针表达式用作删除表达式的操作数之前,没有必要抛弃它的常量。 ——尾注 ]

换句话说,表达式 delete expr 由编译器自动处理const-correctness

不同的故事,例如,如果您尝试直接调用该函数,例如:

::operator delete(p);

【讨论】:

  • 感谢您的回答。您能否详细解释一下编译器如何“处理const 限定符”?只是将其作为特例丢弃?还是deleteconst之间有某种优先级机制?
  • const 属性只是编译器解析的人工构造。对于delete 表达式,编译器只是忽略const
猜你喜欢
  • 2010-11-08
  • 2013-08-17
  • 1970-01-01
  • 2019-04-14
  • 2014-05-29
  • 2016-08-11
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多