iterator_weakly_incrementable
iterator_weakly_incrementable (약한 증가 가능 반복자 개념)
<iterator> 헤더에 정의되어 있어요. 전위·후위 증가 연산자로 증가시킬 수 있는 타입에 대한 요구사항을 규정하는 C++20 개념(concept)이에요. 다만 증가 연산이 반드시 동등성 보존(equality-preserving)일 필요는 없고, 타입 자체도 std::equality_comparable일 필요는 없어요.
출처: cppreference
본문
template< class I >
concept weakly_incrementable =
std::movable<I> &&
requires(I i) {
typename std::iter_difference_t<I>;
requires /*is-signed-integer-like*/<std::iter_difference_t<I>>;
{ ++i } -> std::same_as<I&>; // not required to be equality-preserving
i++; // not required to be equality-preserving
};
(C++20부터)
is-signed-integer-like의 정의에 대해서는 is-integer-like를 참고해요.
이 개념은 전위·후위 증가 연산자로 증가시킬 수 있는 타입이 갖춰야 할 요건을 규정해요. 그런데 그 증가 연산이 반드시 동등성 보존일 필요는 없고, 타입 자체가 std::equality_comparable일 필요도 없어요.
std::weakly_incrementable 타입에서는 a == b라고 해서 ++a == ++b를 보장하지 않아요. 약하게 증가 가능한 타입에 대한 알고리즘은 반드시 단일 패스(single-pass) 알고리즘이어야 해요. 이런 알고리즘은 std::istream_iterator를 통해 입력 데이터의 출처로 istream을 쓸 수 있어요.
의미 요구사항 (Semantic requirements)
I 타입의 객체 i에 대해, I가 std::weakly_incrementable을 모델링하려면 다음 조건이 모두 만족해야 해요.
++i와i++는 같은 정의역(domain)을 가져요.i가 증가 가능하다면,++i와i++모두i를 전진시켜요.i가 증가 가능하다면,std::addressof(++i) == std::addressof(i)예요.
결함 보고 (Defect reports)
이후에 확정된 C++ 표준에 소급 적용된 결함 보고가 있어요. 예를 들어 P2325R3는 C++20에서 default_initializable이 요구됐던 것을 "필요 없음"으로 바꿨어요.