【问题标题】:Are there member functions which are static by default?是否有默认为静态的成员函数?
【发布时间】:2018-07-29 14:39:31
【问题描述】:

默认情况下重载的operator new 是否被视为静态?例如:

template <typename E>
class Link
{
private:
    Link<E>* freeList;
public:
    E element;
    Link<E>* next;
    Link(const E& elemVal, Link<E>* nextVal) { element = elemVal; next = nextVal; }
    Link(Link<E>* nextVal) { next = nextVal; }

    void* operator new(size_t)
    {
        Link<E>* temp=freeList;
        freeList=freeList->next;
        return temp;
    }
};

当我试图编译它时,我得到了以下错误:

Invalid use of member 'Link<E>::freeList' in static member function.

我想知道重载的operator new 是否实际上是静态的。

【问题讨论】:

    标签: c++ operator-overloading static-methods


    【解决方案1】:

    是的!特定于类的operator newoperator delete 的重载是静态成员函数。它们不能是“常规”成员函数,因为在调用它们时没有可用的实例。他们在那里(取消)分配原始存储。对于它们中的任何一个,此时都没有对象实例。

    这在[class.free]/1中有描述:

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

    还有[class.free]/5

    类 X 的任何释放函数都是静态成员(即使 未明确声明为静态)。

    【讨论】:

    • 他们应该让关键字static 必须明确明确,避免这种混淆
    • @bolov - 我想知道 linter 是否可以在这里提供帮助。我可以看到通过 lint 规则执行限定符的好处。
    【解决方案2】:

    是的,static 关键字对于operator new 是可选的,当它被定义为类的成员函数时,它始终是static 成员函数。

    (强调我的)

    单对象和数组分配函数都可以定义为类的公共静态成员函数(版本 (15-18))。如果定义了这些分配函数,则 new 表达式将调用这些分配函数来为此类的单个对象和数组分配内存,除非 new 表达式使用 ::new 形式,它绕过了类范围查找。 关键字static对于这些函数是可选的:无论是否使用,分配函数都是静态成员函数。

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多