2013-09-21 1 views
1

때로는 벡터 반복자를 포인터로 변환해야합니다. vector::data처럼이 작업을 수행 할 수있는 방법이 몇 가지 있습니다. 그러나 &(*some_vector.end())의 유효성에 대해 궁금합니다. 나는 벡터의 끝 부분을 역 참조하는 것이 정의되지 않은 동작이라는 것을 알고 있지만, & 연산자는 표현식의 값을 필요로하지 않으므로 최종 반복기는 실제로이 표현식에서 참조 해제되지 않습니다. 그 맞습니까? 아니면 여전히 정의되지 않은 동작입니까?표현식 '& (* some_vector.end())'가 잘 정의되어 있습니까?

+1

'* some_vector.end()'는 아직도 참조 해제를 시도합니다. – billz

답변

3

시도 data()+end()-begin().

vector 반복자는 원시 포인터로 구현 될 수 있지만 반드시 그럴 필요는 없습니다. iterator가 end iterator 인 경우 itereator를 역 참조하는 것은 정의되지 않습니다. 실제로 iterator는 해당 case를 감지하기 위해 디버그에 설치 될 수 있으며 컴파일러는 절대 수행하지 않는다고 합법적으로 추측 할 수 있습니다. 따라서 명세서 &*it-&*begin() >= size()은 합법적으로 표준에 따라 false으로 처리 될 수 있습니다.

GCC는 하드웨어가 한 가지 일을하는 서명 된 오버플로와 유사한 최적화를 수행하지만 컴파일러는 정의되지 않은 일이 없다고 가정하고 오버플로 감지를 시도하는 전체 코드 분기를 무시할 수 있습니다.

+0

이것은 의미가 있습니다. –

1

반복기의 참조 해제에 대한 전제 조건은 iterator가 최종 반복자와 다르다는 것입니다. 비록 당신이 그 결과로하는 것이 그것의 주소를 취하는 것이라해도, 그것은 여전히 ​​정의되지 않은 행동이다.

관련 문제