Разрешено ли добавлять ноль к нулевому указателю?

9

Я знаю, что арифметика указателей запрещена для нулевых указателей. Но представьте, у меня есть что-то вроде этого:

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)

Возможно ли (разрешено) иметь вышеуказанную end()реализацию? Или необходимо иметь:

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

избежать арифметики указателей с nullptr, потому что arrayBeginэто пустое значение для пустого массива (несмотря на то, arraySizeчто в этом случае он также равен нулю)?

Я знаю, что можно хранить int *end;вместо unsigned size;и вычислять размер как end-begin- но тогда возникает та же проблема: разрешено ли вычислять nullptr - nullptr?

Я был бы особенно признателен за стандартные ссылки.

Ярек С
источник

Ответы:

8

Да, вы можете добавить ноль к нулевому указателю и вычесть один нулевой указатель из другого. Цитирование Раздел аддитивных операторов [expr.add] стандарта C ++:

Когда выражение Jс целочисленным типом добавляется или вычитается из выражения Pтипа указателя, результат имеет тип P.

  • Если Pзначение равно нулевому указателю и равно J0, результатом является значение нулевого указателя.
Сергей Струков
источник
8
Что такое "8,7 7"? Если вы ссылаетесь на Стандарт C ++, пожалуйста, укажите, какой именно. Как правило, лучше использовать раздел «имена» в скобках, поскольку нумерация разделов / глав / абзацев обычно меняется с каждой версией стандарта. В текущем проекте соответствующим разделом являются [expr.add] пункты 4.1 и 5.1 .
Даниэль Лангр