Namespaces
Variants

C++ named requirements: LegacyForwardIterator

From cppreference.net
C++ named requirements

LegacyForwardIterator 는 가리키는 요소로부터 데이터를 읽을 수 있는 LegacyIterator 입니다.

LegacyInputIterator LegacyOutputIterator 와 달리, 멀티패스 알고리즘에서 사용될 수 있습니다.

만약 LegacyForwardIterator it Container 에서 비롯된 것이라면, it 의 값 타입은 컨테이너의 값 타입과 동일하므로, 역참조( * it )를 통해 컨테이너의 값 타입을 얻을 수 있습니다.

목차

요구사항

유형 정의
X 전방 반복자 유형
T X 값 유형 (즉 std:: iterator_traits < X > :: value_type )
Ref std:: iterator_traits < X > :: reference
정의
i , j X 또는 const X 유형의 값들
r X& 유형의 값

X 가 다음의 모든 조건을 만족할 경우 LegacyForwardIterator 를 만족합니다:

  • X LegacyInputIterator 를 만족합니다.
  • X DefaultConstructible 를 만족합니다.
  • 만약 X mutable iterator 라면, Ref T 에 대한 참조입니다.
  • 만약 X 가 constant iterator라면, Ref const T 에 대한 참조입니다.
  • X 타입의 객체는 multi-pass guarantee 를 제공합니다.
  • 만약 i j 가 같다면, i j 모두 dereferenceable 이거나 둘 모두 dereferenceable이 아닙니다.
  • 만약 i j 가 모두 dereferenceable하다면, i == j * i * j 가 동일한 객체에 바인딩된 경우에만 참입니다.
  • 다음 표현식들은 유효해야 하며 지정된 효과를 가져야 합니다:
Expression Type Effects
r ++ convertible to const X & Equivalent to X x = r ;
++ r ;
return x ;
.
* i ++ Ref

동등성 도메인

전방 반복자에 대한 domain == 연산은 동일한 underlying sequence 상의 반복자들에 적용됩니다.

그러나, 값 초기화된 forward iterator들은 비교될 수 있으며, 동일한 타입의 다른 값 초기화된 iterator들과 반드시 동일하게 비교되어야 합니다.

다시 말해, 값 초기화된 forward iterator들은 마치 동일한 빈 시퀀스의 끝을 가리키는 것처럼 동작합니다.

(C++14부터)

멀티 패스 보장

역참조 가능한 두 반복자 a b 가 타입 X 인 경우, 다음 조건들이 모두 충족되면 다중 패스 보장 을 제공합니다:

  • a == b ++ a == ++ b 를 의미합니다.
  • 다음 조건 중 하나가 충족됩니다:
  • X 는 포인터 타입입니다.
  • 표현식 ( void ) ++ X ( a ) , * a 는 표현식 * a 와 동등합니다.

개념(Concept)

std::iterator_traits 의 정의를 위해 다음의 설명 전용(exposition-only) 개념이 정의됩니다.

template < class It >

concept __LegacyForwardIterator =
__LegacyInputIterator < It > && std:: constructible_from < It > &&
std:: is_reference_v < std:: iter_reference_t < It >> &&
std:: same_as <
std:: remove_cvref_t < std:: iter_reference_t < It >> ,
typename std:: indirectly_readable_traits < It > :: value_type > &&
requires ( It it ) {
{ it ++ } - > std:: convertible_to < const It & > ;
{ * it ++ } - > std:: same_as < std:: iter_reference_t < It >> ;

} ;

여기서 설명 전용(exposition-only) 개념 __LegacyInputIterator<T> LegacyInputIterator 에 설명되어 있습니다.

(C++20부터)

참고 사항

std::forward_iterator 개념과 달리, LegacyForwardIterator 요구사항은 역참조가 참조를 반환할 것을 요구합니다.

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 수정된 동작
LWG 1212
( N3066 )
C++98 * i ++ 의 타입이
LegacyBidirectionalIterator 가 요구하는 * i -- 의 타입과 일치하지 않음
타입을
Ref 로 변경
LWG 1311
( N3066 )
C++98 " a == b 이면 ++ a == ++ b "만으로는
다중 패스 보장을 제공하지 않음 [1]
" a == b 이면
++ a ! = b "도 요구 [2]
LWG 3798 C++20 __LegacyForwardIterator
std:: iter_reference_t < It > 가 lvalue 참조 타입이어야 함을 요구
rvalue 참조 타입도
허용
  1. a b 가 동일한 기반 반복자를 사용하는 시나리오에서, ++ a == ++ b 표현식을 평가하면 실제로 기반 컨테이너를 두 번 증가시키지만, 결과는 여전히 true 입니다.
  2. 형식적으로는 ++ b ! = a 를 함축하는 것도 요구됩니다.

참고 항목

input_iterator 가 순방향 반복자임을 지정하며, 동등 비교와 다중 패스를 지원함
(concept)
Iterator library 반복자, 반복자 특성, 어댑터 및 유틸리티 함수에 대한 정의를 제공함