¿Está permitido agregar un cero a un puntero nulo?

9

Sé que la aritmética de punteros no está permitida para punteros nulos. Pero imagina que tengo algo como esto:

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)

¿Es posible (permitido) tener la end()implementación anterior ? O es necesario tener:

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

para evitar la aritmética del puntero con nullptr porque arrayBegines nulo para una matriz vacía (a pesar de arraySizeser también cero en este caso)?

Sé que es posible almacenar en int *end;lugar de unsigned size;y permitir que el tamaño se calcule como end-begin, pero luego surge el mismo problema: ¿se puede calcular nullptr - nullptr?

Agradecería especialmente las referencias estándar.

Jarek C
fuente

Respuestas:

8

Sí, puede agregar cero al puntero nulo y restar un puntero nulo de otro. Citando la sección de operadores aditivos [expr.add] del estándar C ++:

Cuando una expresión Jque tiene un tipo integral se agrega o resta de una expresión Pde tipo puntero, el resultado tiene el tipo de P.

  • Si se Pevalúa como un valor de puntero nulo y se Jevalúa como 0, el resultado es un valor de puntero nulo.
Sergey Strukov
fuente
8
¿Qué es "8.7 7"? Si hace referencia al estándar C ++, especifique cuál. En general, es mejor usar "nombres" de sección entre paréntesis, ya que la numeración de sección / capítulo / párrafo generalmente cambia con cada versión estándar. En el borrador actual, la sección relevante es [expr.add] párrafos 4.1 y 5.1 .
Daniel Langr