【问题标题】:Subtraction of two nullptr values guaranteed to be zero?两个 nullptr 值的减法保证为零?
【发布时间】:2014-12-28 23:20:45
【问题描述】:

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 的位表示只能比较为相等,因为相等运算符有一些魔力?

【问题讨论】:

  • 如果您将xy 视为“两个空指针”或“两个空指针值”,而不是“正如您在问题标题中所说的,两个 nullptr 值。等同于某物,被初始化使用某物,实际上是某物都是不同的概念,最好不要混用。 nullptr 不仅仅是“空指针”的缩写(当然这就是名称的由来),它是一个非常具体的东西。

标签: c++ c++11


【解决方案1】:

是的,这是有效的。它在 C 中是未定义的,但 C++ 为 - 运算符添加了一个特殊异常来定义行为。

5.7 加法运算符 [expr.add]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 2014-01-26
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多