Czy można dodać zero do wskaźnika zerowego?

9

Wiem, że arytmetyka wskaźników jest niedozwolona dla wskaźników zerowych. Ale wyobraź sobie, że mam coś takiego:

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)

Czy to możliwe (dozwolone) mieć powyższą end()implementację? Czy też konieczne jest posiadanie:

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

aby uniknąć arytmetyki wskaźnika z nullptr, ponieważ arrayBeginjest pusty dla pustej tablicy (mimo arraySizeże w tym przypadku jest również zerowy)?

Wiem, że można przechowywać int *end;zamiast unsigned size;i pozwalać na obliczanie rozmiaru jako end-begin- ale wtedy pojawia się ten sam problem: czy można to obliczyć nullptr - nullptr?

Byłbym szczególnie wdzięczny za standardowe referencje.

Jarek C.
źródło

Odpowiedzi:

8

Tak, możesz dodać zero do wskaźnika zerowego i odjąć jeden wskaźnik zerowy od drugiego. Cytując sekcję Operatory addytywne [expr.add] standardu C ++:

Kiedy wyrażenie Jo typie integralnym jest dodawane do wyrażenia Ptypu wskaźnika lub odejmowane od niego , wynik ma typ P.

  • Jeśli Pzostanie wyzerowana wartość wskaźnika zerowego, a Jwyniesie 0, wynikiem będzie wartość wskaźnika zerowego.
Siergiej Strukow
źródło
8
Co to jest „8,7 7”? Jeśli odwołujesz się do standardu C ++, określ, który z nich. Zasadniczo lepiej jest używać „nazw” sekcji w nawiasach, ponieważ numeracja sekcji / rozdziałów / akapitów zasadniczo zmienia się z każdą wersją standardową. W obecnym projekcie odpowiednią sekcją jest [expr.add] pkt 4.1 i 5.1 .
Daniel Langr