操作符删除结合律
Operator delete associativity
在维基百科上查找运算符结合律时,我注意到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 :
::optdelete
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
永远无效
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 多态性和功能结合
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何结合findMin()和delete()来删除BST中的最小节点
- 数组放置 新结合_aligned_malloc,正确的删除方法是什么?
- 你知道学习运算符优先和结合律的方法吗?
- 操作符删除结合律