auto a = new int[0];
[basic.compound.3] 에 따르면 저장된 값 a
은 다음 중 하나 여야합니다.
- (형식의 개체에 대한 포인터
int
)
- 객체의 끝을 지나는 포인터
- 없는
- 무효
유형의 객체가 생성되지 않았으므로 첫 번째 가능성을 배제 할 수 있습니다 int
. C ++에서 널이 아닌 포인터를 리턴해야하므로 세 번째 가능성은 배제됩니다 ( [basic.stc.dynamic.allocation.2] 참조 ). 따라서 우리는 두 가지 가능성이 있습니다 : 객체의 끝을 지나는 포인터 또는 유효하지 않은 포인터.
나는 a
최후의 포인터로 생각하는 경향이 있지만, 그것을 확실하게 확립 할 수있는 평판 좋은 참조는 없습니다. (그러나 [basic.stc] 에서는 delete
이 포인터 가 어떻게 사용되는지 알 수 있습니다 .) 따라서이 답변에서 두 가지 가능성을 모두 접할 것입니다.
복사 초기화와 삭제 사이에 포인터를 읽을 수 a + 1
있습니까?
위의 가능성에 관계없이 [expr.add.4] 에 명시된대로 동작은 정의되지 않습니다 .
경우 a
과거 - 더 - 엔드 포인터,이어서,이를 인덱스 가상 소자 포인트 여겨진다 0
없는 요소 배열. 정수를 추가 j
하는 a
경우에만 정의된다 0≤0+j≤n
여기서, n
상기 어레이의 크기이다. 우리의 경우, n
제로, 그래서 합이 a+j
경우에만 정의되어 j
있다 0
. 특히 추가 1
는 정의되지 않습니다.
a
유효하지 않은 경우 에는 "그렇지 않으면 동작이 정의되지 않습니다." (정말로 정의 된 경우에는 유효한 포인터 값만 포함됩니다.)
또한 언어는 컴파일러 a
가 nullptr
?
아니요. 위에서 언급 한 [basic.stc.dynamic.allocation.2]에서 : "요청이 성공하면 교체 가능한 할당 함수가 반환 한 값은 널이 아닌 포인터 값 입니다. " 또한 C ++ (C는 아님)에 제로 요청에 대한 응답으로 null이 아닌 포인터가 필요하다는 각주 가 있습니다 .
a
확실히 읽을 수 있습니다 (반드시 역 참조 할 수는 없습니다).