É permitido adicionar zero a um ponteiro nulo?

9

Eu sei que a aritmética do ponteiro não é permitida para ponteiros nulos. Mas imagine que eu tenho algo parecido com isto:

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)

É possível (permitido) ter a end()implementação acima ? Ou é necessário ter:

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

evitar aritmética de ponteiro com nullptr porque arrayBeginé nulo para uma matriz vazia (apesar de arraySizetambém ser zero neste caso)?

Eu sei que é possível armazenar int *end;, em vez de unsigned size;e deixe o tamanho ser computada como end-begin- mas, em seguida, vem a mesma questão: É permitido calcular nullptr - nullptr?

Eu apreciaria especialmente as referências padrão.

Jarek C
fonte

Respostas:

8

Sim, você pode adicionar zero ao ponteiro nulo e subtrair um ponteiro nulo de outro. Citando a seção Operadores aditivos [expr.add] do padrão C ++:

Quando uma expressão Jque tem tipo integral é adicionada ou subtraída de uma expressão Pdo tipo ponteiro, o resultado tem o tipo de P.

  • Se Pavalia para um valor de ponteiro nulo e Jpara 0, o resultado é um valor de ponteiro nulo.
Sergey Strukov
fonte
8
O que é "8.7 7"? Se você se referir ao padrão C ++, especifique qual. Geralmente, é melhor usar "nomes" de seção entre colchetes, pois a numeração de seção / capítulo / parágrafo geralmente muda com cada versão padrão. No rascunho atual, a seção relevante é [expr.add] parágrafos 4.1 e 5.1 .
Daniel Langr 19/12/19