在考虑类似的事情时
auto x = new T;
标准是否强制要求内存必须来自operator new
特定类别或全局?即,由于缺乏特定于类的实现,没有办法operator new
从全局以外的任何地方获取内存operator new
?
我认为你有错误的方式。
表达式new T
总是包含两个步骤:
operator new
寻找合适的。如果类T
中存在一个,则采用那个,否则采用全局的。全局的总是存在的,因为这是标准规定的(所以你永远不能“定义”它(因为它已经定义了),但你可以替换它)。
你可以说总是无条件地::new T
选择全局。operator new
一旦分配函数被调用并成功,对象就会在该内存中构造。
如果你说new (a, b, c) T
,那么同样会发生,只是在第 1 步中,我们现在正在寻找operator new
具有适当签名的重载。
不保证是::operator new
,因为内存可以来自特定于类的内存operator new
,但如果不存在此类特定于类的版本,则将使用全局版本。该标准的相关部分是[expr.new]/8
:
new-expression 通过调用分配函数来获取对象的存储空间。...分配函数的名称是 operator new ...
标准是否强制要求内存必须来自 operator new-class-specific 或 global?
是的,它确实。
§5.3.4 [expr.new]
:
p8 new-expression通过调用分配函数(3.7.4.1) 为对象获取存储空间。[...] 如果分配的类型是非数组类型,分配函数的名称是
operator new
[...]。p9 如果new-expression以一元运算符开头
::
,则在全局范围内查找分配函数的名称。否则,如果分配的类型是类类型T
或其数组,则在T
. 如果此查找找不到名称,或者分配的类型不是类类型,则在全局范围内查找分配函数的名称。