11

Is it guaranteed by the C++ standard that if I have two pointers of the same type whose value is equal to nullptr, that the difference between those pointers is equal to 0?

In a pseudo-mathematical notation, does the following predicate hold true?

ForAll x ForAll y (x == nullptr)^(y == nullptr) -> (x - y == 0)

The simplest code example I can think of being:

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

I suppose this boils down to: is it possible to have a valid implementation of the C++ standard for which there are multiple bit representations of nullptr that only compare as being equal because the equality operator does some magic?

1
  • 3
    You'll get along better with the C++ standard and its terminology, if you think of x and y as "two null pointers" or "two null pointer values", rather than "two nullptr values" as you say in your question title. Being equal to something, being initialized using something, and actually being that something are all different concepts, and it's best not to mix them. nullptr isn't just an abbreviation for "null pointer" (although of course that's the reason for the name), it's a very specific something. Commented Dec 28, 2014 at 23:29

1 Answer 1

19

Yes, that is valid. It would be undefined in C, but C++ has added a special exception to the - operator to define the behaviour.

5.7 Additive operators [expr.add]

7 If the value 0 is added to or subtracted from a pointer value, the result compares equal to the original pointer value. If two pointers point to the same object or both point one past the end of the same array or both are null, and the two pointers are subtracted, the result compares equal to the value 0 converted to the type std::ptrdiff_t.

Sign up to request clarification or add additional context in comments.

1 Comment

This answer would be more helpful if it explained the rationale for allowing it in C++.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.