为什么没有 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>
。这是允许的,但不是必需的行为。
在以下内容中:
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>
。这是允许的,但不是必需的行为。