【问题标题】:Why overloaded new operator is implicitly static and no scope resolution required to construct the object为什么重载的 new 运算符是隐式静态的,并且构造对象不需要范围解析
【发布时间】:2014-09-16 17:41:17
【问题描述】:

为什么重载的 new 运算符是隐式静态的,我们如何通过调用重载的 new 运算符而不使用范围解析运算符来分配内存?

在我看来,如果某些东西是静态的,那么我们可以通过类名在 main 中调用它。

class xyz
{
    void* operator new (size_t size); //implicitly declared static
    void operator delete (void *p); //implicitly declared static
};

int main()
{
    C *p = new C;
    delete p;
}

【问题讨论】:

    标签: c++ new-operator


    【解决方案1】:

    draft C++ standard5.3.4 部分 New 段落 9 中说,如果 new 表达式 不以 :: 开头,那么它首先在它们键入的范围内查找,然后如果在全局范围内找不到:

    如果 new 表达式以一元 :: 运算符开头,则分配 在全局范围内查找函数的名称。否则,如果 分配类型是类类型 T 或其数组,分配 在 T 的范围内查找函数的名称。如果查找失败 查找名称,或者如果分配的类型不是类类型,则 在全局范围内查找分配函数的名称

    至于为什么它是隐式静态的,似乎需要一个类型的实例来调用成员分配函数是不方便的限制。似乎还需要不同的语法,因为编译器如何知道使用哪个实例会使事情变得混乱。

    12.5 部分介绍了成员分配函数是隐式静态的这一事实免费存储

    类 T 的任何分配函数都是静态成员(即使不是 显式声明为静态)。

    【讨论】:

      【解决方案2】:

      所有运算符都是隐式的。您也不必对所有其他运算符使用范围运算符。

      想想这会是多么烦人:

      int a = 4 int::operator* 6;
      

      这正是他们这样做的原因。

      除此之外,所有的运算符都在代码的词法处理中被解析。这些文字的含义可以由用户定义:

      第 2.14.8 节讨论文字规则:

      用户定义的文字被视为对文字运算符的调用或 文字运算符模板 (13.5.8)。确定此调用的形式 对于带有 ud-suffix X 的给定用户定义文字 L, 查找文字后缀标识符为 X 的literal-operator-id 在 L 的上下文中使用非限定名称查找规则 (3.4.1)。令 S 是此查找找到的声明集。小号 不能为空。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-09
        • 2014-06-16
        • 1970-01-01
        • 2012-04-23
        • 2019-02-06
        • 2018-08-03
        相关资源
        最近更新 更多