【发布时间】:2011-06-22 00:56:54
【问题描述】:
等式运算符具有关系运算符对指针的语义限制:
==(等于)和 !=(不等于)运算符与关系运算符具有相同的语义限制、转换和结果类型,但它们的优先级较低且结果为真值。 [C++03 §5.10p2]
并且关系运算符对比较指针有限制:
如果两个相同类型的指针p和q指向不同的对象,这些对象不是同一个对象的成员或同一个数组的元素,或者指向不同的函数,或者如果其中只有一个为null,则pq、p=q 未指定。 [§5.9p2]
这是由相等运算符“继承”的语义限制吗?
具体来说,给定:
int a[42];
int b[42];
显然 (a + 3)
【问题讨论】:
-
有趣的问题。如果是这样,那么所有的自我分配测试呢
if (this != &other) -
除了不透明的措辞,看起来真的很简单:标准完全规定了在什么情况下两个指针比较不相等。然而,两个不相关对象的哪个指针值(地址)更大,只是(而且 - 恕我直言 - 相当明显)未指定。
-
@Martin:对于具有相同偏移量但针对不同段的近指针的分段架构怎么样?我认为您不希望在这种情况下完全指定相等性,并且标准要求此比较用例格式正确(必须编译、执行等),据我所知。
-
该标准确实需要有意义的结果,即使在这种情况下 - 即,
==必须只有当它们都是空指针或引用同一个对象时才为真(反之亦然)!=,当然)。 -
在分段内存中,== 和 != 也必须比较指针的分段部分。
标签: c++ pointers standards unspecified-behavior