什么时候两个指针可比?

时间:2014-03-18 06:31:51

标签: c++ pointers typetraits comparison-operators

关于比较两个指针有很多问题,但我没有发现两个类型是否可以比较指针。给定

A* a;
B* b;

我想知道表达式a @ b是否有效,其中@==!=<<=之一, >>=(我不介意nullptr_t或任何其他可以隐式转换为指针的类型。是A, B

的时候吗?
  • 等于?
  • 除了cv-qualification之外一样吗?
  • 在同一个类层次结构中?
  • ...?

我在std::type_traits找不到任何内容。我可以随时进行自己的SFINAE测试,但我正在寻找直接应用它们的规则。我想编译器会更容易,对吧?

编辑再次澄清:我正在比较指针,而不是指向的对象。我想提前知道a @ b会给出编译器错误,而不是它的值(真或假或未指定)。

2 个答案:

答案 0 :(得分:4)

C ++标准

5.9关系运算符

  

可以比较相同类型的对象或函数(指针转换后)的指针,   结果定义如下:

     

- 如果同一类型的两个指针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)

这些比较运算符始终是“有效的”,因为您始终可以使用它们。但结果通常没有意义或有用。

==!=基本上会告诉您ab是否引用同一个对象。如果a == b,则更改* a将影响* b,反之亦然。

><>=<=会告诉您内存地址相对于彼此的位置。通常这些信息与程序的功能无关,在大多数情况下,它将是不可预测的。但是,如果您知道ab指向同一个数组的成员,那么您可能会想到使用它的一个示例。在这种情况下,a < b会告诉您对象*a是否在数组中*b之前。