C++ 在“new int”中是“new”算是接线员吗?

C++ 在“new int”中是“new”算是接线员吗?,c++,language-lawyer,C++,Language Lawyer,表达式newint如在int*x=newint中是一个。术语“新操作员”似乎可与“新表达式”互换使用,例如在本问题中: 在新表达式中使用的关键字是运算符是否正确?为什么 如果没有,是否有其他理由将新表达式称为“新运算符” 我很难找到一个权威的定义,为什么构成一个运营商 我已经理解了为对象分配内存和“新表达式”之间的区别,新表达式最终可能会调用操作符new,而我知道你在寻找语义上的答案,就我的观点而言,它是一个“关键字”(因为它是明确保留的),我假设我们都知道这只是C++的内存分配结构。也就是说,

表达式
newint如在
int*x=newint中是一个。术语“新操作员”似乎可与“新表达式”互换使用,例如在本问题中:

在新表达式中使用的关键字是运算符是否正确?为什么

如果没有,是否有其他理由将新表达式称为“新运算符”

我很难找到一个权威的定义,为什么构成一个运营商


我已经理解了为对象分配内存和“新表达式”之间的区别,新表达式最终可能会调用
操作符new

,而我知道你在寻找语义上的答案,就我的观点而言,它是一个“关键字”(因为它是明确保留的),我假设我们都知道这只是C++的内存分配结构。也就是说,当我想到C++的“运算符”时,我倾向于想到具有一组输入/输出的函数,这些函数可以针对特定类型进行重写。new对于所有类型都是相同的(更令人困惑的是,它可以被覆盖)

不确定CPPFerence的官方名称,但:

新表达式通过调用适当的分配函数来分配存储。如果类型是非数组类型,则函数名为运算符new。如果type是数组类型,则函数名为operator new[]

然后看来
new
是分配内存的表达式,而
new
是该表达式的运算符

使用同样的逻辑:

  • sizeof
    是表达式
    sizeof()
    的一个“运算符”(尽管
    sizeof
    是一个“编译时”运算符,与我们以前使用的运算符略有不同)
  • +
    是表达式的运算符
  • throw
    是表达式
    throw
我仅将其称为新表达式,以避免与
void*运算符new(std::size\u t count)
混淆,后者仅将内存分配为新表达式发票处理过程的一部分(分配内存、开始生存期、调用构造函数)

new
的问题在于它不仅仅是调用
操作符new
。这有点令人困惑,因为对于
x+y
+
只调用
操作符+

在新表达式中使用的关键字
new
是运算符,这样说是否正确?为什么

否。新表达式中的
new
是标识新表达式的关键字

新表达式调用
运算符new
运算符new[]
以获取存储。它还初始化该存储,并在初始化引发时取消分配它(使用
operator delete
operator delete[]

这里有一个明显的区别,就是
操作符new
只被称为可重载的用户可替换函数,而新表达式不仅仅是调用此函数

参考资料:
[expr.new]

新表达式可以通过调用分配函数(
[basic.stc.dynamic.allocation]
)获得对象的存储。 如果新表达式通过抛出异常终止,它可能通过调用释放函数释放存储。 如果分配的类型是非数组类型,则分配函数的名称为
operator new
,解除分配函数的名称为
operator delete
。 如果分配的类型是数组类型,则分配函数的名称为
operator new[]
,解除分配函数的名称为
operator delete[]


作为反例,我们定义了两者

T operator+(T, T);
void* T::operator new(std::size_t);
对于某些类型的T,则以任一形式添加:

T a, b;
T c = a + b;
T d = T::operator +(a, b);
是一样的。中缀符号只是运算符调用的语法糖

但是,分配的行为非常不同:

T *p = new T;
// does much more than
void *v = T::operator new(sizeof(T));
因此,为调用
操作符new
调用新表达式语法糖是不合理的。因此,
new
关键字不仅仅是选择要调用的函数。它不可能是,或者它必须提到也可能被调用的
运算符delete
函数。

这是由,它清楚地区分了一个新表达式和一个新表达式如何通过调用一个名为
运算符new
的分配函数来获得存储。特别是,从[强调我的]:

新表达式可以通过调用分配函数([basic.stc.dynamic.allocation])获得对象的存储。如果新表达式通过抛出异常终止,它可能通过调用释放函数释放存储。如果分配的类型是非数组类型,分配函数的名称是
运算符new
,解除分配函数的名称是运算符delete。如果分配的类型是数组类型,分配函数的名称是operator
new[]
,解除分配函数的名称是operator
delete[]


在新表达式中使用的关键字
new
是运算符,这样说是否正确

特别地,示例(尽管不规范)将此函数描述为运算符函数;“[…]新的
运算符:”

[…]相反,可以使用新运算符的显式括号版本[…]

否。

嗯,是的,在某种意义上,有人认为<代码> new <代码>在<代码> new int/代码>中是一个运算符。然而,这一观点(大部分)与标准不符

首先,列出语言中的运算符。也不要误以为这些只是“预处理操作符”;没有这样的di