分配操作符重载

Allocation operator overloading

本文关键字:重载 操作符 分配      更新时间:2023-10-16
#include <iostream>
#include <new>
#include <cstdlib>
using std::cout;
struct C{ };
struct A
{
    void* operator new(std::size_t, C*, C*){ A a; return &a; }
};
A *a= new A; //candidate function not viable: requires 3 arguments, but 1 was provided

int main(){ }

我一直不明白这个错误。

如果分配的类型是类类型T或其数组,则分配函数的名称在t的作用域中查找查找查找名称失败,或者分配的类型不是类类型,分配函数的名称在全局作用域中查找。

在全局作用域中隐式定义了分配函数,由library提供。有什么问题吗?我期望重载解析会被应用。

我也想了解一下,使用这样的分配函数(有三个参数)有什么意义。

正如引号所说,如果在类的作用域中查找分配函数未能找到名称,则只会在全局作用域中查找它。在您的示例中,它正在查找名称,因此不会在全局作用域中查找它。唯一的问题是你的分配函数的参数数量与你调用它的方式不一致。

如果您想确保使用全局分配函数:

A *a = ::new A;

如果你想调用你定义的分配函数,你需要这样做:

A *a = new (someC, someOtherC) A;