您可以将 nullptr 与其他指针进行比较以进行排序吗?它总是更小吗?

ste*_*anv 26 c++ pointer-arithmetic comparison-operators nullptr

这个问题基于我发现监控可能内存泄漏的代码,因此它包含一些您可能不希望在常规程序中看到的代码,例如排序指针。

但是,我看到设置了一个指针nullptr,然后将该指针与最大地址进行比较。是否由 C++ 标准保证nullptr总是小于其他指针operator<

eer*_*ika 25

您可以将 nullptr 与其他指针进行比较以进行排序吗?

不,您不能将nullptr指针或其他空指针常量与指针进行有序比较。


对于我的其余答案,我将介绍“您能否将具有空值的指针与其他指针进行比较以进行排序?”

是的。但结果是否有用是另一回事。

它总是更小吗?

否。除非另一个操作数也为空,否则在这种情况下,两个操作数都不能保证比较大或小。

标准报价(最新草案):

[expr.rel]

比较指向对象的不等指针的结果是根据符合以下规则的偏序定义的:

  • 【不适用】如果两个指针指向同一个数组的不同元素,或者指向其子对象,则要求指向下标较高的元素的指针比较大。
  • [不适用]如果两个指针递归地指向同一对象的不同非静态数据成员,或指向此类成员的子对象,则需要将指向后声明成员的指针进行比较,前提是这两个成员具有相同的访问权限控制([class.access]),两个成员都不是零大小的子对象,并且它们的类不是联合。
  • [适用]否则,两个指针都不需要比较大于另一个。

std::less如果您需要严格的总顺序,您应该使用来比较指针。Null 仍然不能保证作为最小值进行比较。

  • 我有一个平台,其可寻址内存位于 0x00000000 和 0x40000000,并且使用 0x20000000 作为“nullptr”。将指针与“&lt;”进行比较会将所有 RAM 指针排序在“nullptr”之前,并将所有 ROM 指针排序在其之后。 (7认同)
  • 我没看到最后一个链接。即使在“指针是整数,nullptr 只是 0”的系统上,“nullptr”是否最小的问题仍然取决于系统是否将指针视为有符号整数或无符号整数。这是相当任意的;例如,我认为 x86 没有自然的选择。(您可以在指针上使用“ja”或“jg”)。 (2认同)

Sne*_*tel 14

不。涉及 nullptr 的小于比较没有指定的行为,虽然它们不涉及未定义的行为,但结果甚至不能保证一致。

< on 指针提供的保证非常有限。即使比较两个单独的堆分配对象也不能保证一致(为此,您需要std::less,它将始终在排序中的某个位置放置一个空指针,但不在标准定义的位置)。你可以说,最好是没有指向的对象将比较等于一个nullptr。

  • 在现实生活中,遵循语言规则几乎总是比尝试猜测什么是安全的更务实。 (3认同)

jac*_*k X 4

对于operator<,nullptr 总是小于其他指针

不,标准不支持nullptr通过关系运算符将 a 与指针进行比较。

要比较关系运算符的操作数,首先将以下规则应用于两个操作数,即 expr.rel#2

通常的算术转换是对算术或枚举类型的操作数执行的。如果两个操作数都是指针,则执行指针转换和限定转换以将它们转换为复合指针类型。转换后,操作数应具有相同的类型。

nullptr不是指针,而是称为空指针常量。因此,“执行指针转换和限定转换以将它们转换为复合指针类型”将不适用于它。因此,它违反了“转换后,操作数应具有相同的类型”

Clang给出了正确的诊断。由于代码格式不正确,因此谈论结果是什么没有意义。