Est-il permis d'ajouter un zéro à un pointeur nul?

9

Je sais que l'arithmétique des pointeurs est interdite pour les pointeurs nuls. Mais imaginez que j'ai quelque chose comme ça:

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)

Est-il possible (autorisé) d'avoir la end()mise en œuvre ci-dessus ? Ou faut-il avoir:

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

éviter l'arithmétique du pointeur avec nullptr car arrayBeginest nul pour un tableau vide (bien qu'il soit arraySizeégalement nul dans ce cas)?

Je sais qu'il est possible de stocker int *end;au lieu de unsigned size;et de laisser la taille être calculée comme end-begin- mais vient alors le même problème: est-il autorisé à calculer nullptr - nullptr?

J'apprécierais particulièrement les références standard.

Jarek C
la source

Réponses:

8

Oui, vous pouvez ajouter zéro au pointeur nul et soustraire un pointeur nul d'un autre. Citant la section des opérateurs additifs [expr.add] de la norme C ++:

Lorsqu'une expression de Jtype intégral est ajoutée ou soustraite d'une expression Pde type pointeur, le résultat a le type de P.

  • Si Pévalue à une valeur de pointeur nulle et Jévalue à 0, le résultat est une valeur de pointeur nulle.
Sergey Strukov
la source
8
Qu'est-ce que "8.7 7"? Si vous vous référez à la norme C ++, veuillez préciser laquelle. En règle générale, il est préférable d'utiliser les «noms» de section entre crochets, car la numérotation des sections / chapitres / paragraphes change généralement avec chaque version standard. Dans le projet actuel, la section pertinente est [expr.add] paragraphes 4.1 et 5.1 .
Daniel Langr