널 포인터에 0을 추가 할 수 있습니까?


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이 경우 에도 0 임)?

나는 그것을 저장할 수 알고 int *end;대신 unsigned size;크기는 다음과 같이 계산 될 수 있습니다 end-begin-하지만 동일한 문제가 온다 : 그것은 계산 할 수 있나요 nullptr - nullptr?

특히 표준 참조에 감사드립니다.

답변:


8

예, 널 포인터에 0을 추가하고 널 포인터를 다른 것에서 뺄 수 있습니다. C ++ 표준의 덧셈 연산자 연산자 [expr.add] 섹션 :

발현되면 J일체형을 가지고 추가 또는 식으로부터 감산 P포인터 타입, 결과의 유형을 갖는다 P.

  • 않으면 PNULL 포인터 값으로 평가 J0 평가 결과는 NULL 포인터 값이다.

8
"8.7 7"는 무엇입니까? C ++ 표준을 참조하는 경우 어느 것을 지정하십시오. 섹션 / 챕터 / 단락 번호는 일반적으로 각 표준 버전에 따라 변경되므로 일반적으로 섹션 "이름"을 괄호 안에 사용하는 것이 좋습니다. 현재 초안에서 관련 섹션은 [expr.add] 단락 4.15.1 입니다.
Daniel Langr 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.