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

Does placement new operator disable the default new operator?

本文关键字:运算符 默认 是否      更新时间:2023-10-16

>我有这样的代码片段

#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.

我的问题是默认的新运算符去哪里了?我希望新的默认语法仍然有效,这是规范中任何地方提到的行为吗?

他们只是隐藏了全局的。如果在类范围内提供operator 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
};