Namespaces
Variants

std:: iterator_traits <std::counted_iterator>

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
헤더에 정의됨 <iterator>
template < std:: input_iterator I >

requires /* see below */
struct iterator_traits < std:: counted_iterator < I >> : std:: iterator_traits < I > {
using pointer = std:: conditional_t < std:: contiguous_iterator < I > ,
std:: add_pointer_t < std:: iter_reference_t < I >> ,
void > ;

} ;
(C++20부터)

표준 부분 특수화 또는 프로그램 정의 특수화에서 생성된 사용자 정의로부터 속성을 상속받으며, std:: iterator_traits < I > 의 멤버 타입 pointer 가 조정된 상태로, 여기서 I input_iterator 를 모델링합니다.

특히, iterator_concept (존재하는 경우)와 iterator_category std:: iterator_traits < I > 로부터 상속됩니다.

requires-clause의 조건은 true 가 되는 경우는 오직 std:: iterator_traits < I > 가 기본 템플릿으로부터 생성되지 않을 때뿐입니다.

목차

참고

P2259R1 이전에는, 이 특수화가 std:: iterator_traits < I > 이 기본 템플릿에서 생성된 경우에도 사용되었습니다. 그 결과 std:: counted_iterator < I > 를 iterator 개념(예: forward_iterator )에 대해 테스트할 때, /*ITER_CONCEPT*/ 의 결정이 I::iterator_concept 를 고려하지 않아, std:: counted_iterator < I > 가 해당 개념을 모델링할 수 없는 것처럼 잘못 동작하는 경우가 있었습니다. 이 잘못된 동작은 libstdc++ 10.4 이전 버전과 MSVC STL VS 2022 17.0 Preview 3 이전 버전에서 구현되었습니다.

표준 라이브러리는 포인터 타입, std::iterator_traits , std::counted_iterator , 그리고 std::common_iterator 에 대한 부분 특수화를 제공합니다.

예제

#include <iterator>
#include <list>
#include <type_traits>
#include <vector>
int main()
{
    std::vector v{1, 2, 3, 4};
    std::list l{1, 2, 3, 4};
    std::counted_iterator iv{v.begin(), 3};
    std::counted_iterator il{l.begin(), 3};
    static_assert(std::is_same<int*, std::iterator_traits<decltype(iv)>::pointer>());
    static_assert(std::is_same<void, std::iterator_traits<decltype(il)>::pointer>());
}

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
P2259R1 C++20 requires-clause가 없음
pointer 가 무조건 void 로 정의됨
제약 조건 추가됨

참고 항목

iterator의 속성에 대한 통일된 인터페이스를 제공합니다
(클래스 템플릿)