为什么没有 header 的新展示位置 keyword/operator/function 无法识别?

Why isn't placement new keyword/operator/function recognised without header?

在以下内容中:

int main()
{
    new int; // Works
    
    
    int* pmem = 0;

    new (pmem) int;// Doesn't recognize new keyword/operator/function???

}

在这种情况下,如果不包含 < iostream > header,它将无法识别 'new'。这是为什么?为什么 'new' 不需要 header 而 placement new 需要?如果 'new' 需要定义一个函数,那么为什么 'int* a = new int;' 可以工作?由于它没有在任何地方定义,我认为它是语言的一部分。然而 'new (&int) int;' 'placement new' 不是语言的一部分?

Visual Studio 给出错误:

'operator new': no overloaded function takes 3 arguments

Placement new 不仅仅用于“no-op”分配。它是为 new 提供超出 object 大小的额外参数的通用术语。一个标准的例子是 std::nothrow.

由于我们提供参数,编译器必须进行重载解析以选择合适的 operator new 函数。这意味着必须事先声明重载。最基本的重载是隐式声明的(以某种方式),而 void* operator new(std::size_t, void* ptr) noexcept(执行此“分配”的 standard library function)不是。所以我们必须包括 header (<new>*) 用于重载解析。

那是 30 年前的设计选择。它可以由另一个 built-in 完成,但是由于将 objects 放入 pre-allcoated 原始存储被认为是一个非常高级的功能(与简单的动态分配相反),添加库依赖可能似乎并没有太大的障碍。


* - 您看到 <iostream> 影响行为,因为它可能直接或间接包含 <new>。这是允许的,但不是必需的行为。