放置新运算符是否会禁用默认的新运算符?

时间:2019-12-10 16:24:41

标签: c++ new-operator

我有一个这样的代码段

#include <cstring>
#define DISABLE_DEFAULT_NEW                                                    \
  void* operator new(size_t aSize, void* aPtr);                                \
  void operator delete(void* aPtr);

class A
{
public:
  DISABLE_DEFAULT_NEW
  A() {}
};

int
main()
{

  A* a = new A();
  return 0;
}

编译时,我会看到类似这样的错误消息

disable_new.cpp:17:10: error: no matching function for call to 'operator new'
  A* a = new A();
         ^
disable_new.cpp:9:3: note: candidate function not viable: requires 2 arguments, but 1 was provided
  DISABLE_DEFAULT_NEW
  ^
disable_new.cpp:3:9: note: expanded from macro 'DISABLE_DEFAULT_NEW'
  void* operator new(size_t aSize, void* aPtr);                                \
        ^
1 error generated.

我的问题是默认的新运算符在哪里?我希望new的默认语法仍然有效,规范中是否提到了行为问题?

1 个答案:

答案 0 :(得分:3)

他们只是隐藏全局的。如果在类范围内提供operator new

(重点是我的)

  

新表达式首先在类范围内,然后在全局范围内寻找适当的分配函数的名称。请注意,根据name lookup rules,对于试图分配此类对象的new表达式,在类作用域中声明的任何分配函数都会隐藏所有全局分配函数

这意味着,如果您在类中定义任何operator new,则也必须在类中定义其他必要的形式,例如

class A
{
public:
  DISABLE_DEFAULT_NEW
  A() {}
  void* operator new  ( std::size_t count ) { return ::operator new(count); } // forward to global operator new
};