运算符删除关联性
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] 的东西,它们都是一元表达式(递增、递减、delete
s他们自己)
也就是说,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) @ c
或 a @ (b @ c)
(其中 @
是某个运算符)。不过,这仅对采用两个操作数的运算符才真正有意义。根本没有办法以允许您提出关联性回答的问题的方式组合 delete
。
关联性是关于 a op b op c
是否被解析为 (a op b) op c
或 a op (b op c)
。
delete
是一元运算符,所以不能关联。它没有结合性。
并且 delete delete x
永远无效。
在维基百科上查找运算符关联性时,我注意到 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:
::optdelete
cast-expression
::optdelete []
cast-expression
其中 cast-expression 定义在 [expr.cast]:
cast-expression:
unary-expression
(
type-id)
cast-expression
而 一元表达式 是一大堆定义了 [expr.unary] 的东西,它们都是一元表达式(递增、递减、delete
s他们自己)
也就是说,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) @ c
或 a @ (b @ c)
(其中 @
是某个运算符)。不过,这仅对采用两个操作数的运算符才真正有意义。根本没有办法以允许您提出关联性回答的问题的方式组合 delete
。
关联性是关于 a op b op c
是否被解析为 (a op b) op c
或 a op (b op c)
。
delete
是一元运算符,所以不能关联。它没有结合性。
并且 delete delete x
永远无效。