Darf man einem Nullzeiger eine Null hinzufügen?

9

Ich weiß, dass Zeigerarithmetik für Nullzeiger nicht zulässig ist. Aber stell dir vor, ich habe so etwas:

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)

Ist es möglich (erlaubt), die obige end()Implementierung zu haben ? Oder ist es notwendig zu haben:

  int *end() const { return (arraySize == 0) ? nullptr : (arrayBegin + arraySize); }

Zeigerarithmetik mit nullptr zu vermeiden, weil arrayBeginnull für ein leeres Array ist (obwohl arraySizees in diesem Fall auch Null ist)?

Ich weiß, dass es möglich ist, die Größe zu speichern, int *end;anstatt sie unsigned size;zu berechnen, end-beginaber dann kommt das gleiche Problem: Darf sie berechnet werden nullptr - nullptr?

Ich würde mich besonders über Standardreferenzen freuen.

Jarek C.
quelle

Antworten:

8

Ja, Sie können dem Nullzeiger Null hinzufügen und einen Nullzeiger von einem anderen subtrahieren. Zitieren des Abschnitts Additive Operatoren [expr.add] des C ++ - Standards:

Wenn ein Ausdruck Jmit integralem Typ zu einem Ausdruck Pvom Zeigertyp hinzugefügt oder von diesem subtrahiert wird , hat das Ergebnis den Typ P.

  • Wenn Pein Nullzeigerwert und J0 ausgewertet wird, ist das Ergebnis ein Nullzeigerwert.
Sergey Strukov
quelle
8
Was ist "8.7 7"? Wenn Sie sich auf den C ++ - Standard beziehen, geben Sie bitte an, welcher. Im Allgemeinen ist es besser, Abschnittsnamen in Klammern zu verwenden, da sich die Nummerierung von Abschnitten / Kapiteln / Absätzen im Allgemeinen mit jeder Standardversion ändert. Im aktuellen Entwurf ist der relevante Abschnitt die Absätze 4.1 und 5.1 .
Daniel Langr