C++ named requirements: LegacyForwardIterator
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) 개념이 정의됩니다.
여기서 설명 전용(exposition-only) 개념
|
(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 참조 타입도
허용 |
- ↑ a 와 b 가 동일한 기반 반복자를 사용하는 시나리오에서, ++ a == ++ b 표현식을 평가하면 실제로 기반 컨테이너를 두 번 증가시키지만, 결과는 여전히 true 입니다.
- ↑ 형식적으로는 ++ b ! = a 를 함축하는 것도 요구됩니다.
참고 항목
|
(C++20)
|
input_iterator
가 순방향 반복자임을 지정하며, 동등 비교와 다중 패스를 지원함
(concept) |
| Iterator library | 반복자, 반복자 특성, 어댑터 및 유틸리티 함수에 대한 정의를 제공함 |