Reputation: 1261
I know that pointer arithmetic is disallowed for null pointers. But imagine I have something like this:
class MyArray {
int *arrayBegin; // pointer to the first array item, NULL for an empty array
unsigned arraySize; // size of the array, zero for an empty array
public:
int *begin() const { return arrayBegin; }
int *end() const { return arrayBegin + arraySize; } // possible? (arrayBegin may be null)
Is it possible (allowed) to have the above end()
implementation? Or is it necessary to have:
int *end() const { return (arraySize == 0) ? nullptr : (arrayBegin + arraySize); }
to avoid pointer arithmetic with nullptr because arrayBegin
is null for an empty array (despite arraySize
also being zero in this case)?
I know it's possible to store int *end;
instead of unsigned size;
and let size be computed as end-begin
- but then comes the same issue: Is it allowed to compute nullptr - nullptr
?
I would especially appreciate standard references.
Upvotes: 16
Views: 1054
Reputation: 401
Yes, you can add zero to the null pointer and subtract one null pointer from another. Quoting Additive operators [expr.add] section of the C++ standard:
When an expression
J
that has integral type is added to or subtracted from an expressionP
of pointer type, the result has the type ofP
.
- If
P
evaluates to a null pointer value andJ
evaluates to 0, the result is a null pointer value.
Upvotes: 17