C++全局重载new运算符是否属重定义?签名规则存疑
全局作用域重载C++ new运算符:是重载还是重定义?
全局作用域下定义单参数的operator new(size_t),不是重载,而是直接替换标准库提供的默认实现,这是C++标准专门规定的特殊规则,不违背常规的重载要求。
为什么这不是常规重载?
常规函数/运算符重载要求不同的签名,但对于全局的operator new(size_t),C++标准允许用户提供同签名的版本来覆盖默认逻辑。当你写出这段代码时:
void* operator new(size_t n){ return malloc(n); }
编译器会用你的实现完全替代标准库的默认内存分配逻辑,所有全局范围内的new T调用都会触发这个自定义版本。
关于数组new的困惑
数组对应的全局分配函数是operator new[](size_t),规则和单参数operator new完全一致:全局作用域下定义同签名的版本,也是替换默认实现,而非重载。只有当你为new添加额外参数时,才属于常规的运算符重载:
- 比如placement new的
void* operator new(size_t, void*),或者自定义参数的void* operator new(size_t, int),这些版本的签名和标准单参数版本不同,调用时需要传递对应额外参数来匹配(比如new (buffer) T调用placement new),这才符合你对重载的理解。
总结
- 单参数的全局
operator new和operator new[]是标准允许的重定义替换,不属于重载范畴,所以不存在违背重载规则的问题。 - 只有带额外参数的new版本,才是常规的运算符重载,遵循“不同签名”的要求。
内容的提问来源于stack exchange,提问作者Aman Sharma
相关产品推荐
相关产品推荐

