std:: contiguous_iterator
|
헤더에 정의됨
<iterator>
|
||
|
template
<
class
I
>
concept contiguous_iterator
=
|
(C++20부터) | |
contiguous_iterator
개념은
random_access_iterator
를 개선하여 표시된 요소들이 메모리에서 연속적으로 저장된다는 보장을 제공합니다.
|
이는 프로그램이 연속 반복자 i 의 역참조, 증가, 감소 연산의 부수 효과에 의존할 수 없음을 의미합니다. 표준 라이브러리 함수들이 std:: to_address ( i ) 로 얻은 포인터를 통해 동작할 수 있기 때문입니다. |
(C++26부터) |
목차 |
반복자 개념 결정
이 개념의 정의는 전시 전용(exposition-only) 별칭 템플릿 /*ITER_CONCEPT*/ 을 통해 명시됩니다.
/*ITER_CONCEPT*/ < I > 를 결정하기 위해, ITER_TRAITS < I > 를 다음과 같이 정의합니다: I 만약 std:: iterator_traits < I > 특수화가 기본 템플릿으로부터 생성된 경우, 그렇지 않으면 std:: iterator_traits < I > 입니다:
- ITER_TRAITS < I > :: iterator_concept 이 유효하고 타입을 명시하는 경우, /*ITER_CONCEPT*/ < I > 은 해당 타입을 나타냅니다.
- 그렇지 않고 ITER_TRAITS < I > :: iterator_category 이 유효하고 타입을 명시하는 경우, /*ITER_CONCEPT*/ < I > 은 해당 타입을 나타냅니다.
-
그렇지 않고
std::
iterator_traits
<
I
>
이 기본 템플릿으로부터 생성된 경우,
/*ITER_CONCEPT*/
<
I
>
은
std::random_access_iterator_tag
을 나타냅니다.
(즉, std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: contiguous_iterator_tag > 이 false 라고 가정됩니다.) - 그 외의 경우, /*ITER_CONCEPT*/ < I > 은 타입을 나타내지 않으며 치환 실패를 발생시킵니다.
의미론적 요구사항
a
와
b
를
역참조 가능한(dereferenceable)
반복자로,
c
를
I
타입의 역참조 불가능한(non-dereferenceable) 반복자로 가정할 때,
b
가
a
로부터
도달 가능(reachable)
하고
c
가
b
로부터 도달 가능할 경우, 타입
I
는 다음의 모든 조건이 충족되고 그것이 포함하는 모든 개념이 모델링된 경우에만
contiguous_iterator
를 모델링합니다:
- std:: to_address ( a ) == std:: addressof ( * a ) .
- std:: to_address ( b ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( b - a ) .
- std:: to_address ( c ) == std:: to_address ( a ) + std:: iter_difference_t < I > ( c - a ) .
- std:: to_address ( I { } ) 가 올바르게 정의됩니다.
- ranges:: iter_move ( a ) 는 std :: move ( * a ) 와 동일한 타입, 값 카테고리, 효과를 가집니다.
- 만약 ranges:: iter_swap ( a, b ) 가 유효한 형식이라면, 이는 ranges:: swap ( * a, * b ) 와 동등한 효과를 가집니다.
동등성 보존
표준 라이브러리 개념의 requires expressions 에 선언된 표현식들은 equality-preserving 해야 합니다(다르게 명시된 경우를 제외하고).
암시적 표현 변형
상수 lvalue 피연산자에 대해 수정하지 않는 표현식을 사용하는 requires expression 는 또한 implicit expression variations 를 요구합니다.
참고 사항
contiguous_iterator
는 완전한 객체 타입에 대한 모든 포인터 타입에 의해 모델링됩니다.
표준 라이브러리의 반복자 유형 중 C++17에서
LegacyContiguousIterator
요구 사항을 충족해야 하는 것들은 C++20에서도
contiguous_iterator
를 모델링해야 합니다.
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3607 | C++20 |
contiguous_iterator
가 사용자 정의
ranges::iter_move 및 ranges::iter_swap 동작을 가질 수 있었음 |
금지됨 |
| LWG 4170 | C++20 |
값 초기화된
contiguous_iterator
쌍이
빈 범위를 표현하지 못할 수 있었음 |
보장됨 |
참고 항목
|
(C++20)
|
bidirectional_iterator
가 상수 시간 내 전진 및 첨자 연산을 지원하는 임의 접근 반복자임을 명시
(컨셉) |