为什么 new 和 delete 运算符签名与所有其他运算符不同

Why new and delete operators signatures are different from all other operators

新运算符的签名是:

void* operator new(size_t count)

“算”字和“新”字之间有一个白字space。这是:

  1. 不同于所有其他运算符签名(除了 new、delete 及其对应的数组)。例如:

    T& operator=(const T& other)

  2. 不符合 C++ 不允许白色 spaces 的函数名规则。

我假设“operator”在这种情况下是一个关键字...但如果这是正确的,为什么在所有其他运算符函数签名中不是这种情况?

有不一致的解释吗?

void* operatornew(size_t count) 是一个名为 operatornew 的函数,它接受一个 size_t 和 returns 一个 void*.

operator= 和大多数其他运算符不需要 space 的原因是这些符号在名称中无效,因此 operator= 不需要 space.

C++ 语法实际上是根据标记编写的,在所有类型的运算符定义之间是一致的。 operators 是特殊用途的,并且在 operator 关键字之后可以跟随哪些标记方面是固定的,但是出现的白色 space 在标准中的任何地方都没有强制要求。

就C++语法而言,以下签名没有区别:

auto operator+=(const Foo&) -> Foo&
auto operator +=(const Foo&) -> Foo&
auto operator += (const Foo&) -> Foo&
auto 
operator
+=
(const Foo&) -> Foo&

See example

operator new 在这里不再或更少地保持一致。这里唯一的偏差是一些运算符 allow no space 在 operator 标记之后,例如 operator= —— 这样做的原因是C++ 语法中标记的分解方式。

大多数标记是字母数字序列,在特殊字符处中断,例如白色space 或+= 等。在这种情况下,operator= 中断为两个标记 -- operator=,它们构成运算符。

这也意味着一些运算符也是多个标记的复合,例如 operator new[] -- 也可以写成 operator new [],因为它由 3 个标记组成:operatornew[],如 [over.oper.general]/1 的脚注所示:

[Note 1: The operators new[], delete[], (), and [] are formed from more than one token. The latter two operators are function call and subscripting. — end note]