放置运算符新查找

Placement operator new lookup

我是 C++ 的新手,对以下示例感到困惑:

#include <iostream>
#include <cstddef>
#include <cstdlib>

class Test{
public:
    enum test_type{ test1 = 0, test2, test3};
    void *operator new(size_t sz, test_type t){
        return malloc(sz);
    }
};

class SomeClass: public Test{
public:
    SomeClass(int a): a(a){}
    int a;
};

int main(int argc, char ** argv){
    SomeClass *sc = new(Test::test1) SomeClass(10);
    std::cout << sc->a << std::endl;
}

DEMO

我阅读了 cpp-reference page 中的名称查找规则,但没有找到任何关于为什么找到基 class 中定义的运算符 new 并将其用于派生 class 的任何解释(它可能包含一个额外的成员)。

在基类 class 中声明 operator new 然后使用它为派生的 classes 分配内存是否是一种常见的方法(这个想法来自一些开源用 C++ 编写的项目)?

分配函数 operator new 是 "looked up in the scope of" 创建的 class,在本例中是 SomeClass。当您在 class 范围内查找名称时,它可以找到作为基 class 成员的名称。这就是这种情况下发生的情况。

您可能想知道为什么 operator new 的查找不使用某些特殊规则将基础 class 成员排除在外。好吧,我认为在某些情况下使用基数 class operator new 是有道理的。派生的 class 可能包含一个额外的成员这一事实本身不会引起问题,因为语言将传递 derived class 的大小operator new,确保它知道必须为派生的 class 对象分配多少内存。并且使用基 class operator new 允许从 CRTP 基 class 引入所述运算符,或者只是为派生的 classes 提供一种方便的方式来分配同一个池子。