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 仍然不能保证作为最小值进行比较。
Sne*_*tel 14
不。涉及 nullptr 的小于比较没有指定的行为,虽然它们不涉及未定义的行为,但结果甚至不能保证一致。
< on 指针提供的保证非常有限。即使比较两个单独的堆分配对象也不能保证一致(为此,您需要std::less,它将始终在排序中的某个位置放置一个空指针,但不在标准定义的位置)。你可以说,最好是没有指向的对象将比较等于一个nullptr。
对于operator<,nullptr 总是小于其他指针
不,标准不支持nullptr通过关系运算符将 a 与指针进行比较。
要比较关系运算符的操作数,首先将以下规则应用于两个操作数,即 expr.rel#2
通常的算术转换是对算术或枚举类型的操作数执行的。如果两个操作数都是指针,则执行指针转换和限定转换以将它们转换为复合指针类型。转换后,操作数应具有相同的类型。
nullptr不是指针,而是称为空指针常量。因此,“执行指针转换和限定转换以将它们转换为复合指针类型”将不适用于它。因此,它违反了“转换后,操作数应具有相同的类型”。
Clang给出了正确的诊断。由于代码格式不正确,因此谈论结果是什么没有意义。
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |