C ++标准是否保证如果我有两个相同类型的指针,其值等于nullptr,那些指针之间的差异等于0?
在伪数学符号中,以下谓词是否成立?
ForAll x ForAll y(x == nullptr)^(y == nullptr) - > (x - y == 0)
我能想到的最简单的代码示例:
int* x = nullptr;
int* y = nullptr;
assert(x - y == 0);
我想这可以归结为:是否有可能有一个C ++标准的有效实现,其中有多个位表示的nullptr只能比较为相等,因为相等运算符会产生一些魔力?
答案 0 :(得分:11)
是的,这是有效的。它在C中是未定义的,但是C ++为-
运算符添加了一个特殊的例外来定义行为。
5.7添加剂运算符[expr.add]
7如果将值
0
添加到指针值或从指针值中减去,则结果将比较原始指针值。如果两个指针指向同一个对象,或者两个指针都指向同一个数组的末尾或两者都为空,并且减去了两个指针,则结果将比较等于转换为类型{{1的值0
}}