Apakah diizinkan menambahkan nol ke pointer nol?

9

Saya tahu bahwa pointer aritmatika tidak diizinkan untuk null pointer. Tetapi bayangkan saya memiliki sesuatu seperti ini:

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)

Apakah mungkin (diizinkan) untuk memiliki end()implementasi di atas ? Atau apakah perlu memiliki:

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

untuk menghindari aritmatika pointer dengan nullptr karena arrayBeginnull untuk array kosong (meskipun arraySizejuga nol dalam kasus ini)?

Saya tahu mungkin untuk menyimpan int *end;daripada unsigned size;membiarkan ukuran dihitung end-begin- tetapi kemudian muncul masalah yang sama: Apakah diizinkan untuk menghitung nullptr - nullptr?

Saya akan sangat menghargai referensi standar.

Jarek C
sumber

Jawaban:

8

Ya, Anda dapat menambahkan nol ke pointer nol dan mengurangi satu pointer nol dari yang lain. Mengutip bagian Additive operator [expr.add] dari standar C ++:

Ketika ekspresi Jyang memiliki tipe integral ditambahkan atau dikurangi dari ekspresi Ptipe pointer, hasilnya memiliki tipe P.

  • Jika Pmengevaluasi ke nilai pointer nol dan Jmengevaluasi ke 0, hasilnya adalah nilai pointer nol.
Sergey Strukov
sumber
8
Apa itu "8.7 7"? Jika Anda merujuk pada Standar C ++, harap tentukan yang mana. Secara umum, lebih baik menggunakan "nama" bagian dalam tanda kurung, karena penomoran bagian / bab / paragraf umumnya berubah dengan setiap versi Standar. Dalam draf saat ini, bagian yang relevan adalah [expr.add] paragraf 4.1 dan 5.1 .
Daniel Langr