Boş göstericiye sıfır eklenmesine izin veriliyor mu?


9

İşaretçi aritmetiğinin boş göstericiler için izin verilmediğini biliyorum. Ama şöyle bir şey olduğunu hayal et:

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)

Yukarıdaki end()uygulamaya sahip olmak mümkün mü (izin veriliyor) ? Yoksa aşağıdakilere sahip olmak gerekli mi:

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

arrayBeginboş bir dizi için null olduğundan ( arraySizebu durumda da sıfır olmasına rağmen) nullptr ile işaretçi aritmetiği önlemek için ?

Bunun int *end;yerine saklamanın mümkün olduğunu biliyorum unsigned size;ve boyut olarak hesaplanmasına izin verdim end-begin- ama sonra aynı sorun geliyor: Hesaplamaya izin veriliyor nullptr - nullptrmu?

Özellikle standart referansları takdir ediyorum.

Yanıtlar:


8

Evet, boş göstericiye sıfır ekleyebilir ve bir boş göstericiyi diğerinden çıkarabilirsiniz. C ++ standardının Ekleme işleçleri [expr.add] bölümünden alıntı :

İşaretçi türündeki Jbir ifadeye integral türüne sahip bir ifade eklendiğinde veya bu ifadeden çıkarıldığında P, sonuç türüne sahiptir P.

  • Eğer Pbir boş işaretçi değeri ve değerlendirir J0 değerlendirir, sonuç bir boş gösterici bir değerdir.

8
"8.7 7" nedir? C ++ Standardına başvurursanız, lütfen hangisini belirtin. Genel olarak, bölüm / bölüm / paragraf numaralandırması genellikle her Standart sürümle değiştiğinden, parantez içinde bölüm "adları" kullanmak daha iyidir. Mevcut taslakta, ilgili bölüm [expr.add] paragraf 4.1 ve 5.1'dir .
Daniel Langr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.