È consentito aggiungere uno zero a un puntatore null?


9

So che l'aritmetica dei puntatori non è consentita per i puntatori null. Ma immagina di avere qualcosa del genere:

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)

È possibile (permesso) avere l' end()implementazione di cui sopra ? O è necessario avere:

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

evitare l'aritmetica del puntatore con nullptr perché arrayBeginè null per un array vuoto (nonostante arraySizesia anche zero in questo caso)?

So che è possibile archiviare int *end;anziché unsigned size;e lasciare che la dimensione sia calcolata come end-begin- ma poi arriva lo stesso problema: è consentito calcolare nullptr - nullptr?

Gradirei in particolare i riferimenti standard.

Risposte:


8

Sì, è possibile aggiungere zero al puntatore null e sottrarre un puntatore null da un altro. Citando la sezione Operatori additivi [expr.add] dello standard C ++:

Quando un'espressione Jcon tipo integrale viene aggiunta o sottratta da un'espressione Pdi tipo puntatore, il risultato ha il tipo di P.

  • Se Prestituisce un valore di puntatore null e Jrestituisce 0, il risultato è un valore di puntatore null.

8
Che cos'è "8.7 7"? Se fai riferimento allo standard C ++, specifica quale. Generalmente, è meglio usare "nomi" di sezione tra parentesi, poiché la numerazione di sezione / capitolo / paragrafo generalmente cambia con ogni versione standard. Nel presente progetto, la sezione pertinente è [expr.add] paragrafi 4.1 e 5.1 .
Daniel Langr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.