运算符删除关联性

Operator delete associativity

在维基百科上查找运算符关联性时,我注意到 delete 具有从右到左的关联性。来源被引用为 msdn, I checked it and it comes under group 3 precedence, right to left associativity. So I checked the C++ standard (n4296)

5.3 Unary expressions [expr.unary]

1) Expressions with unary operators group right-to-left

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 有什么关联性?

C++ 标准通常不根据优先级或结合性定义运算符。它根据语法定义它们。从 [expr.delete] 开始,delete 用于 delete-expression,定义为:

delete-expression:
    ::opt delete cast-expression
    ::opt delete [] cast-expression

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

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

一元表达式 是一大堆定义了 [expr.unary] 的东西,它们都是一元表达式(递增、递减、deletes他们自己)

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

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

delete x+y

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

正如 Barry 所说,优先级是由语法决定的(有一些运算符不太符合优先级的基本概念,所以你只能从语法中完全正确地弄清楚发生了什么,不是优先级 table).

然而,即使我们忽略了这一点,delete 的优先级仅(至少通常)决定了一个语句是否是 legal/allowed,而不是它的含义。举一个反例,+*,优先级决定了 2 * 3 + 4 产生 10 而不是 14(即乘法优先)。

delete 的情况下,delete 语句不会产生任何值,因此根本不允许像 delete x + y; 这样的语句。它将被解析为 (delete x) + y;,但由于 delete x 不会产生可以添加到任何其他内容的值,因此结果始终被禁止(并且如果您更改运算符,那将保持为真) .

关联性对于 delete 没有真正意义。特别是,关联性处理是否像:a @ b @ c 将被解析为 (a @ b) @ ca @ (b @ c)(其中 @ 是某个运算符)。不过,这仅对采用两个操作数的运算符才真正有意义。根本没有办法以允许您提出关联性回答的问题的方式组合 delete

关联性是关于 a op b op c 是否被解析为 (a op b) op ca op (b op c)

delete是一元运算符,所以不能关联。它没有结合性。

并且 delete delete x 永远无效。