nullポインターにゼロを追加することはできますか?


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); }

arrayBegin空の配列ではnullであるため、nullptrを使用したポインタ演算を回避するには(arraySizeこの場合もゼロであるにもかかわらず)?

int *end;代わりに保存unsigned size;してサイズを計算させるend-beginことは可能ですが、同じ問題が発生しnullptr - nullptrます。計算は許可されますか?

特に標準的な参照をいただければ幸いです。

回答:


8

はい、ヌルポインターにゼロを追加し、別のヌルポインターを減算できます。C ++標準の加法演算子[expr.add]セクションの引用:

発現の際にJ整数型を有する追加または式から減算されるPポインタ型の、結果としてのタイプを有していますP

  • 場合PNULLポインタ値とに評価J0と評価され、結果はヌルポインタ値です。

8
「8.7 7」とは?C ++標準を参照する場合は、どちらを指定するかを指定してください。セクション/章/段落の番号付けは通常、各標準バージョンによって異なるため、一般的には、セクションの「名前」を角かっこで使用することをお勧めします。現在のドラフトでは、関連セクションは[expr.add] 4.15.1の段落です。
Daniel Langr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.