2017-09-17 4 views
5

나는 STL을 배우고 있으며 reverse_iterator은 나 혼란 스럽다. 그것은 기본 생성자가 있지만 그것을 사용하는 방법을 이해하지 않습니다. 시도 :reverse_iterator에 기본 생성자가있는 이유는 무엇입니까?

reverse_iterator<int*> r{}; 
r --; 

및 프로그램이 충돌했습니다. 나는이 사용법에 아무런 요점도 없으며 쉽게 충돌을 일으킬 수 있다고 생각합니다. 그래서 왜 기본 생성자가 사용되도록 허용 되었습니까?

+2

아마도 "초기화되지 않은"반복기를 나중에 특정 값으로 지정하도록 지원하는 것일 것입니다. 기본 생성 반복자를 초기화되지 않은 변수로 취급하십시오. 즉, 의미있는 값을 지정할 때까지는 아무 것도하지 마십시오. – AnT

+0

왜'nullptr'을 가리키는 포인터를 정의하고 역 참조 할 수 있습니까? 허용되지 않는 것은 매우 안전하지 않고 정의되지 않은 많은 것들이 있습니다. 그것은 C++에게 속도를 제공하는 것이며, 발자국을 발휘합니다. –

+0

@RickAstley 나는 C++ 표준 라이브러리가 "발을 들여 놓을"사고 방식에서 "비용이 들지 않으면 발을 쏘지 않을 것"이라고 생각합니다. 안전하지 않은 것이 허용되면 더 많은 이유가 있어야합니다. –

답변

3

std::reverse_iteratorbidirectional iterators이며 기본값 구성 가능해야한다는 뚜렷한 요구 사항이 있습니다.

why bidirectional iterators are default-constructible에 대해서는 대부분 구현하기가 쉽지 않으며 보증을 제공하기 때문에 알고리즘을 구현하기가 더 쉽습니다.

int* p = nullptr; *p;과 같은 것을 쓰는 것은 자체적으로 UB입니다. p이 역 참조 할 수 없다는 전제 조건을 위반하여 어댑터가 이러한 종류의 동작을 "채택"하게하는 것은 자연 스럽습니다.

3

cppreference에 대한 설명서는 말한다 :

1) 디폴트의 생성자입니다. 전류는 값으로 초기화됩니다. 생성 된 반복자에 대한 연산은 값 초기화 된 반복자에 대한 해당 연산에도 동작이 정의 된 경우에만 동작을 정의합니다.

기본으로 생성되는 의미있는 일부 반복자가 있습니다. 일반적으로 컨테이너와 직접 연결된 컨테이너가 아닙니다. 예 : istream iterator : http://en.cppreference.com/w/cpp/iterator/istream_iterator/istream_iterator. 그러나 양방향성이 아니기 때문에 역순으로 사용할 수 없습니다.

그러나 기본적으로 양방향이며 기본 생성자/값 초기화 프로그램에는 적어도 일부 연산이 정의되어있는 반복기를 사용할 수 있습니다. 이러한 반복자의 경우 동작을 reverse_iterator에 반영해야합니다.

관련 문제