是否允许向空指针添加零?

Jar*_*k C 10 c++ null pointer-arithmetic

我知道指针算法不允许用于空指针。但想象一下我有这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

是否有可能(允许)进行上述end()实现?或者是否有必要拥有:

  int *end() const { return (arraySize == 0) ? nullptr : (arrayBegin + arraySize); }
Run Code Online (Sandbox Code Playgroud)

避免使用 nullptr 进行指针运算,因为arrayBegin空数组为 null(尽管arraySize在这种情况下也为零)?

我知道可以存储int *end;而不是unsigned size;让大小计算为end-begin- 但随之而来的是同样的问题:是否允许计算nullptr - nullptr

我会特别欣赏标准参考。

Ser*_*kov 9

是的,您可以将零添加到空指针并从另一个空指针中减去一个。引用C++ 标准的加法运算符[expr.add]部分:

当一个J整数类型的表达式P与指针类型的表达式相加或相减时,结果的类型为P

  • 如果P计算结果为空指针值且J计算结果为 0,则结​​果为空指针值。

  • 什么是“8.7 7”?如果您参考 C++ 标准,请指定哪一个。一般来说,最好在括号中使用章节“名称”,因为章节/章节/段落编号通常随每个标准版本而变化。在当前草案中,相关部分是[expr.add]第[4.1](http://eel.is/c++draft/expr.add#4.1)和[5.1](http://eel.is /c++draft/expr.add#5.1)。 (9认同)