代码之家  ›  专栏  ›  技术社区  ›  user3528438

当“指向对象类型的指针”与“指向空的指针”进行相等性比较时,如何理解转换规则?

  •  -4
  • user3528438  · 技术社区  · 8 年前

    n1570 6.5.9.5 (Equality operators) 说:

    5……如果一个操作数是指向对象类型的指针,另一个是指向void的限定或非限定版本的指针,则前者将转换为后者的类型。

    如果“前者”是“后者”是“指向对象类型的指针”和“指向void的指针”,则表示在转换后,比较发生在两个 void*

    2.下列情况之一应成立:

    两个操作数都具有算术类型;

    两个操作数都是指向兼容类型的限定或非限定版本的指针;

    一个操作数是指向对象类型的指针,另一个是指向void的限定或非限定版本的指针;或

    一个操作数是指针,另一个是空指针常量。

    这是N1570的语言缺陷吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   John Bollinger    8 年前

    如果“前者”是“后者”是“指向对象类型的指针”和“指向void的指针”,则表示在转换后,比较发生在两个 void* s

    是的,我就是这样读的。

    根据6.5.9.2,未定义:

    不。您引用本标准第6.5.9.2节,显然是因为您认为您所询问的案例不在该节列举的备选方案列表中,但您错了。该备选方案包括以下情况:

    一个操作数是指向对象类型的指针,另一个是指向void的限定或非限定版本的指针;

    这里重要的是要理解 void 指向对象类型的指针,用于

    这个 无效的 类型包括一组空值; 它是一个不完整的对象类型 这是无法完成的。

    (6.2.5/19;增加强调)

    6.5.9.2不应被解释为暗示: 无效的 不是对象类型;而是说: void * 相当于 全部的 对象指针类型,当然包括对象本身。

    两个操作数都是指向兼容类型的限定或非限定版本的指针

    每种类型都与自身兼容(6.2.7/1)。

        2
  •  1
  •   too honest for this site    8 年前

    void * s是(转换后,根据相等运算符属性)兼容类型。

    我的参考是:

    “-两个操作数都是指向兼容类型的合格或不合格版本的指针;”