关于比较两个指针有很多问题,但我没有发现两个类型是否可以比较指针。给定
A* a;
B* b;
我想知道表达式a @ b
是否有效,其中@
是==
,!=
,<
,<=
之一, >
,>=
(我不介意nullptr_t
或任何其他可以隐式转换为指针的类型。是A, B
我在std::type_traits
找不到任何内容。我可以随时进行自己的SFINAE测试,但我正在寻找直接应用它们的规则。我想编译器会更容易,对吧?
编辑再次澄清:我正在比较指针,而不是指向的对象。我想提前知道a @ b
会给出编译器错误,而不是它的值(真或假或未指定)。
答案 0 :(得分:4)
C ++标准
可以比较相同类型的对象或函数(指针转换后)的指针, 结果定义如下:
- 如果同一类型的两个指针p和q指向同一个对象或函数,或者两者都指向一个过去 在同一数组的末尾,或者都是空的,那么p&lt; = q和p&gt; = q两者都产生真,p
q都是 屈服于假。- 如果同一类型的两个指针p和q指向不是同一成员的不同对象 对象或同一数组的元素或不同的函数,或者如果只有其中一个为null,则为结果 pq,p&lt; = q和p&gt; = q未指定。
- 如果两个指针指向同一对象的非静态数据成员,或指向子对象或数组元素 这些成员,递归地,指向后面声明的成员的指针比较大提供的 两个成员具有相同的访问控制(第11条),并且他们的类不是联盟。
- 如果两个指针指向具有不同访问控制的同一对象的非静态数据成员 (第11条)结果未指明。
- 如果两个指针指向同一个union对象的非静态数据成员,则它们比较相等(之后 如有必要,转换为void *。如果两个指针指向同一个数组或超出的数组 在数组的末尾,指向具有较高下标的对象的指针比较高。
- 未指定其他指针比较。 §
答案 1 :(得分:1)
这些比较运算符始终是“有效的”,因为您始终可以使用它们。但结果通常没有意义或有用。
==
和!=
基本上会告诉您a
和b
是否引用同一个对象。如果a == b
,则更改* a将影响* b,反之亦然。
>
,<
,>=
和<=
会告诉您内存地址相对于彼此的位置。通常这些信息与程序的功能无关,在大多数情况下,它将是不可预测的。但是,如果您知道a
和b
指向同一个数组的成员,那么您可能会想到使用它的一个示例。在这种情况下,a < b
会告诉您对象*a
是否在数组中*b
之前。