默认情况下,重载的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
是否实际上是静态的。
答案 0 :(得分:4)
是的!类特定的operator new
和operator delete
的重载是静态成员函数。它们不能是“常规”成员函数,因为在调用它们时没有实例可用。他们在那里(去)分配原始存储。对于这两个对象,那时都没有对象实例。
这在[class.free]/1中有描述:
类T的任何分配函数都是静态成员(即使不是) 明确声明为静态)。
类X的任何释放函数都是静态成员(即使 没有明确声明为静态)。
答案 1 :(得分:3)
是的,static
关键字对于operator new
是可选的,当它被定义为类的成员函数时,它将始终是static
成员函数。
(重点是我的)
单对象和数组分配函数都可以定义为类的公共静态成员函数(版本(15-18))。如果定义,则这些分配函数将由new-expressions调用,以为此类的单个对象和数组分配内存,除非新表达式使用形式:: new绕过类范围查找。 关键字static对于这些函数是可选的:无论是否使用,分配函数都是静态成员函数。