때로는 벡터 반복자를 포인터로 변환해야합니다. vector::data
처럼이 작업을 수행 할 수있는 방법이 몇 가지 있습니다. 그러나 &(*some_vector.end())
의 유효성에 대해 궁금합니다. 나는 벡터의 끝 부분을 역 참조하는 것이 정의되지 않은 동작이라는 것을 알고 있지만, &
연산자는 표현식의 값을 필요로하지 않으므로 최종 반복기는 실제로이 표현식에서 참조 해제되지 않습니다. 그 맞습니까? 아니면 여전히 정의되지 않은 동작입니까?표현식 '& (* some_vector.end())'가 잘 정의되어 있습니까?
1
A
답변
3
시도 data()+end()-begin()
.
vector
반복자는 원시 포인터로 구현 될 수 있지만 반드시 그럴 필요는 없습니다. iterator가 end
iterator 인 경우 itereator를 역 참조하는 것은 정의되지 않습니다. 실제로 iterator는 해당 case를 감지하기 위해 디버그에 설치 될 수 있으며 컴파일러는 절대 수행하지 않는다고 합법적으로 추측 할 수 있습니다. 따라서 명세서 &*it-&*begin() >= size()
은 합법적으로 표준에 따라 false
으로 처리 될 수 있습니다.
GCC는 하드웨어가 한 가지 일을하는 서명 된 오버플로와 유사한 최적화를 수행하지만 컴파일러는 정의되지 않은 일이 없다고 가정하고 오버플로 감지를 시도하는 전체 코드 분기를 무시할 수 있습니다.
+0
이것은 의미가 있습니다. –
1
반복기의 참조 해제에 대한 전제 조건은 iterator가 최종 반복자와 다르다는 것입니다. 비록 당신이 그 결과로하는 것이 그것의 주소를 취하는 것이라해도, 그것은 여전히 정의되지 않은 행동이다.
관련 문제
- 1. NRVO -이 프로그램의 출력이 잘 정의되어 있습니까?
- 2. int 프로모션 : 다음 사항이 잘 정의되어 있습니까?
- 3. SVG 필터 요소는 얼마나 잘 정의되어 있습니까?
- 4. 그런 할당 스타일이 잘 정의되어 있습니까?
- 5. 이 "유형 형벌"은 잘 정의되어 있습니까?
- 6. 이 C 명령문의 순서가 잘 정의되어 있습니까?
- 7. 값 초기화 된 반복자와 비교하는 것이 잘 정의되어 있습니까?
- 8. 읽기 (fd, NULL, 0); 그것은 무엇을합니까? 잘 정의되어 있습니까?
- 9. C에서 구조체의 패딩 양은 컴파일러에 종속적입니까 아니면 잘 정의되어 있습니까?
- 10. 같은 주소에 여러 번 새로 배치하는 것이 잘 정의되어 있습니까?
- 11. 랜덤 루프 종료 조건을 갖는 것이 잘 정의되어 있습니까?
- 12. strncmp (NULL, "foo", 0)는 잘 정의되어 있습니까?
- 13. ERROR_PENDING은 어디에 정의되어 있습니까?
- 14. CCSlider가 coco2d에 정의되어 있습니까?
- 15. 오랫동안 정의되어 있습니까?
- 16. NULL 문자열이 정의되어 있습니까?
- 17. Widget.Material.Light.TextView.ListSeparator는 어디에 정의되어 있습니까?
- 18. DIR은 어디에 정의되어 있습니까?
- 19. (,) 내부적으로 어떻게 정의되어 있습니까?
- 20. $ 행은 어디에 정의되어 있습니까?
- 21. 스타일은 어디에 정의되어 있습니까?
- 22. copy_to_user는 어디에 정의되어 있습니까?
- 23. # 기호는 C에 정의되어 있습니까?
- 24. Rails.application은 어디에 정의되어 있습니까?
- 25. php가 0으로 정의되어 있습니까?
- 26. GL_UNSIGNED_INT_8_8_8_8_REV는 어디에 정의되어 있습니까?
- 27. ConfigDSN은 어디에 정의되어 있습니까?
- 28. 삭제되었지만 여전히 정의되어 있습니까?
- 29. android.camera.NEW_PICTURE는 어디에 정의되어 있습니까?
- 30. glSwapBuffers는 어디에 정의되어 있습니까?
'* some_vector.end()'는 아직도 참조 해제를 시도합니다. – billz