放置新运算符是否会禁用默认的新运算符?
Does placement new operator disable the default 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.
我的问题是默认的新运算符去哪里了?我希望新的默认语法仍然有效,这是规范中任何地方提到的行为吗?
他们只是隐藏了全局的。如果在类范围内提供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
};
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 放置新运算符是否会禁用默认的新运算符?
- 从类重载的新运算符运行非默认构造函数
- 为 unordered_map 中的元素设置默认构造函数(如果是 [] 运算符)
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 删除复制构造函数是否也会删除默认的复制/移动运算符?
- 模板中默认类型的重载运算符
- 是否有一种方法可以在超载运算符函数中接触默认运算符函数
- 重载运算符是具有较小默认对齐方式的新增运算符
- 默认参数中的 c++ new 运算符及其副作用
- 是否可以使用 T::运算符< 作为模板函数的默认参数?
- POD 类型是否可以具有显式声明的默认移动分配运算符
- 是否可以使 std 容器使用默认运算符为新?
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 三元运算符默认值
- c++中的新运算符+默认构造函数
- C++赋值运算符默认返回
- 我们可以更改字符串流对象的重载运算符">>"默认行为吗?