两个nullptr值相减是否保证为零?

9

在C++标准中是否保证如果我有两个值相等并且类型相同的指针,它们的值都为nullptr,那么这两个指针之间的差异是否等于0?

用伪数学符号表示,以下谓词是否成立?

对于所有x和y,(x == nullptr)^(y == nullptr) -> (x - y == 0)

我能想到的最简单的代码示例是:

int* x = nullptr;
int* y = nullptr;
assert(x - y == 0);

我认为这可以简化为一个问题: 是否可能有一种有效的C++标准实现,其中nullptr具有多个位表示,并且仅通过等于比较运算符进行比较,因为相等运算符执行了某些魔法操作?

3
如果你把 xy 看作 "两个空指针" 或者 "两个空指针值",而不是你在问题标题中说的 "两个 nullptr 值",那么你会更好地理解 C++ 标准和其术语。等于某个东西、使用某个东西进行初始化以及实际上 某个东西这些概念是不同的,请尽量不要混淆它们。nullptr 不仅仅是 "空指针" 的缩写(当然,这也是其名称的原因),它是一个非常具体的东西。 - Steve Jessop
1个回答

16

是的,这是有效的。在 C 中它将是未定义的,但是 C++ 已经为 - 运算符添加了一个特殊的例外来定义其行为。

5.7 加法运算符 [expr.add]

7 如果将值 0 添加到指针值或从指针值中减去,结果与原始指针值相等。如果两个指针指向同一对象或都指向同一数组的末尾或都为空,并且两个指针相减,则结果与转换为类型 std::ptrdiff_t 的值 0 相等。


如果这个答案解释了在C++中允许它的原理,那么它会更有帮助。 - Bruce Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接