操作符删除结合律

Operator delete associativity

本文关键字:结合律 删除 操作符      更新时间:2023-10-16

在维基百科上查找运算符结合律时,我注意到delete具有从右到左的结合律。源代码被引用为msdn,我检查了一下,它在第3组优先级下,从右到左结合律。所以我检查了c++标准(n4296)

5.3一元表达式[expr.unary]

1)包含一元操作符的表达式

unary-expression:
    postfix-expression
    ++ cast-expression
    -- cast-expression
    unary-operator cast-expression
    sizeof unary-expression
    sizeof ( type-id )
    sizeof ... ( identifier )
    alignof ( type-id )
    noexcept-expression
    new-expression
    delete-expression
unary-operator: one of
    * & + - ! ~

这意味着什么?delete有什么结合律呢?

正如Barry所说,优先级是由语法决定的(并且有一些操作符并不完全符合优先级的基本概念,因此您只能真正从语法而不是优先级表中了解完全正确的情况)。

然而,即使忽略它,delete only的优先级(至少通常)决定语句是否合法/被允许,而不是它的含义。举个反例,对于+*,优先级决定2 * 3 + 4产生10而不是14(即乘法优先)。

delete的情况下,delete语句不会产生任何值,所以像delete x + y;这样的语句是不允许的。它将被解析为(delete x) + y;,但由于delete x不会产生一个可以添加到其他任何值的值,因此结果总是被禁止的(如果您更改了操作符,它将保持为真)。

结合性对delete没有意义。具体来说,结合性处理的是:a @ b @ c将被解析为(a @ b) @ c还是a @ (b @ c)(其中@是某个运算符)。但这只对带有两个操作数的运算符有意义。根本没有办法将delete组合成一种允许您提出结合律所回答的问题的方式。

c++标准通常不根据优先级或结合性来定义操作符。它从语法的角度来定义它们。在[exp .delete]中,delete用于delete表达式,该表达式定义为:

delete-expression :
   ::opt delete cast-expression
,,,::选择delete [] cast-expression

其中cast-expression在[expr.cast]中定义:

cast-expression:
,,, unary-expression
,,,,( type-id ) cast-expression

一元表达式是一大堆定义的东西[expr。

也就是说,delete *x是从右到左关联的,因为(delete (*x))是根据语法解析该表达式的唯一方法。

这也是cppreference引用delete的优先级的原因,因为它是CC_25的直接结果。例如,delete+高,因为在这样的表达式中:

delete x+y

x+y不是一元表达式,因此唯一合法的语法解析应该是(delete x) + y

关联性是关于a op b op c是解析为(a op b) op c还是a op (b op c)

delete是一元操作符,因此不能关联。它没有结合律

delete delete x永远无效