Чи можна додати нуль до нульового вказівника?


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

Так, до нульового вказівника можна додати нуль і віднімати один нульовий покажчик від іншого. Цитуючи розділи операторів Additive [expr.add] стандарту C ++:

Коли вираз, Jякий має інтегральний тип, додається або віднімається від виразу Pтипу вказівника, результат має тип P.

  • Якщо Pоцінюється до нульового значення вказівника і Jоцінюється до 0, результатом є значення нульового вказівника.

8
Що таке "8,7 7"? Якщо ви посилаєтесь на стандарт C ++, будь ласка, вкажіть, який із них. Як правило, краще використовувати розділи "імена" в дужках, оскільки нумерація розділів / глав / абзаців зазвичай змінюється з кожною стандартною версією. У поточному проекті відповідним розділом є пункти 4.1 та 5.1 [expr.add] .
Даніель Лангр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.