C++ new的内存必须来自操作员new吗?

C++ new的内存必须来自操作员new吗?,c++,c++11,C++,C++11,当考虑一些事情的时候 auto x = new T; 该标准是否强制要求内存必须来自运算符new-特定于类或全局?i、 例如,考虑到缺少特定于类的运算符new,一致性实现无法从除全局运算符new?之外的任何地方获得内存,因此不能保证是::运算符new,因为内存可以来自特定于类的运算符new,但如果不存在此类特定于类的版本,则将使用全局版本。本标准的相关部分为[expr.new]/8: 新表达式通过调用分配函数获取对象的存储。。。分配函数的名称为运算符new 我想你搞错了 表达式new T始终由

当考虑一些事情的时候

auto x = new T;

该标准是否强制要求内存必须来自
运算符new
-特定于类或全局?i、 例如,考虑到缺少特定于类的
运算符new
,一致性实现无法从除全局
运算符new

之外的任何地方获得内存,因此不能保证是
::运算符new
,因为内存可以来自特定于类的
运算符new
,但如果不存在此类特定于类的版本,则将使用全局版本。本标准的相关部分为
[expr.new]/8

新表达式通过调用分配函数获取对象的存储。。。分配函数的名称为运算符new


我想你搞错了

表达式
new T
始终由两个步骤组成:

  • 搜索合适的新操作员。如果类
    T
    中存在一个,则取该类,否则取全局类。全局的总是存在的,因为这是标准规定的(因此您永远不能“定义”它(因为它已经定义),但您可以替换它)

    您可以说
    ::new T
    始终无条件地选择全局
    运算符new

  • 一旦分配函数被调用并成功,对象将在该内存中构造

  • 如果您说
    new(a,b,c)T
    ,那么同样的情况也会发生,只是在步骤1中,我们现在正在寻找具有适当签名的
    运算符new
    重载

    该标准是否强制内存必须来自运算符new-特定于类还是全局

    是的

    §5.3.4[新增解释]

    p8新表达式通过调用分配函数(3.7.4.1)获得对象的存储。[…]如果分配的类型是非数组类型,分配函数的名称是
    运算符new
    […]

    p9如果新表达式以一元
    运算符开头,则在全局范围中查找分配函数的名称。否则,如果分配的类型是类类型
    T
    或其数组,则在
    T
    的范围内查找分配函数的名称。如果此查找无法找到名称,或者分配的类型不是类类型,则会在全局范围中查找分配函数的名称


    因此,除了全局或特定于类的运算符new之外,一致性实现绝对不可能调用任何东西?@DeadMG:我似乎很清楚:存储是从分配函数获得的,分配函数是运算符new。是的,分配/解除分配函数名称是
    运算符new/delete/[]
    仅限。还请注意,您可以使用
    ::
    覆盖特定于类的分配器,以强制执行全局分配器:
    auto x=::new T
    如果您使用了
    auto x
    ,是因为
    T*x
    可能是错误的,还是因为
    T
    可能是数组类型?在这种情况下,您要寻找的答案是肯定的,它可以来自
    操作员new[]
    而不是
    操作员new
    ?我去给我拿件外套。不,是因为我懒。T的类型是不相关的。