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에 대해, Istd::weakly_incrementable을 모델링하려면 다음 조건이 모두 만족해야 해요.

  • ++ii++는 같은 정의역(domain)을 가져요.
  • i가 증가 가능하다면, ++ii++ 모두 i를 전진시켜요.
  • i가 증가 가능하다면, std::addressof(++i) == std::addressof(i)예요.

결함 보고 (Defect reports)

이후에 확정된 C++ 표준에 소급 적용된 결함 보고가 있어요. 예를 들어 P2325R3는 C++20에서 default_initializable이 요구됐던 것을 "필요 없음"으로 바꿨어요.

더 알아보기 (Learn more)

cppreference