Namespaces
Variants

std::ranges:: lazy_split_view<V, Pattern>:: inner_iterator

From cppreference.net
Ranges library
Range adaptors
template < bool Const >
struct /*inner_iterator*/ ;
(начиная с C++20)
( только для демонстрации* )

Возвращаемый тип lazy_split_view:: outer_iterator :: value_type :: begin ( ) .

Const соответствует шаблонному аргументу outer_iterator .

Содержание

Типы членов

Член Определение
Base maybe-const  < Const, V >
( только для демонстрации* )
iterator_concept
iterator_category
(условно присутствует)

Присутствует только если Base моделирует forward_range .

value_type ranges:: range_value_t < Base >
difference_type ranges:: range_difference_t < Base >

Члены данных

Член Описание
outer_iterator < Const > i_ (приватный) итератор в базовое view родительского объекта lazy_split_view
( объект-член только для демонстрации* )
bool incremented_ (приватный) флаг, который указывает, был ли operator ++ вызван на этом объекте хотя бы один раз
( объект-член только для демонстрации* )

Функции-члены

(constructor)
(C++20)
создает итератор
(public member function)
base
(C++20)
возвращает базовый итератор
(public member function)
operator*
(C++20)
возвращает текущий элемент
(public member function)
operator++ operator++ (int)
(C++20)
перемещает итератор вперед
(public member function)

Функции-члены

std::ranges::lazy_split_view:: inner_iterator :: inner_iterator

/*inner_iterator*/ ( ) = default ;
(1) (since C++20)
constexpr explicit /*inner_iterator*/ ( /*outer_iterator*/ < Const > i ) ;
(2) (since C++20)
1) Инициализирует член данных i_ значением по умолчанию через его инициализатор члена по умолчанию (= /*outer_iterator*/ < Const > ( ) ).
2) Инициализирует i_ значением std :: move ( i ) .

Член данных incremented_ инициализируется своим инициализатором члена по умолчанию значением false .

std::ranges::lazy_split_view:: inner_iterator :: base

constexpr const ranges:: iterator_t < Base > & base ( ) const & noexcept ;
(1) (since C++20)
constexpr ranges:: iterator_t < Base > base ( ) &&
requires ranges:: forward_range < V > ;
(2) (since C++20)

Возвращает копию базового итератора.

1) Копирует результат из базового итератора. Эквивалентно return i_. /*cur*/ ( ) ; .
2) Перемещает результат из базового итератора. Эквивалентно return std :: move ( i_. /*cur*/ ( ) ) ; .

std::ranges::lazy_split_view:: inner_iterator :: operator*

constexpr decltype ( auto ) operator * ( ) const ;
(начиная с C++20)

Возвращает элемент, на который указывает базовый итератор.

Эквивалентно return * i_. /*cur*/ ( ) ; .

std::ranges::lazy_split_view:: inner_iterator :: operator++

constexpr /*inner_iterator*/ & operator ++ ( ) ;
(1) (since C++20)
constexpr decltype ( auto ) operator ++ ( int ) ;
(2) (since C++20)
1) Тело функции эквивалентно:
incremented_ = true ;

if constexpr ( ! ranges:: forward_range < Base > )
{
if constexpr ( Pattern :: size ( ) == 0 )
return * this ;
}
++ i_. /*cur*/ ( ) ;

return * this ;
2) Эквивалентно:
if constexpr ( ranges:: forward_range < Base > )

{
auto tmp = * this ;
++* this ;
return tmp ;
}
else
++* this ; // оператор return отсутствует

Функции, не являющиеся членами класса

operator==
(C++20)
сравнивает итераторы или итератор и std::default_sentinel
(функция)
iter_move
(C++20)
преобразует результат разыменования базового итератора в соответствующий тип rvalue-ссылки
(функция)
iter_swap
(C++20)
обменивает объекты, на которые указывают два базовых итератора
(функция)

operator== (std::ranges::split_view:: inner_iterator )

friend constexpr bool operator == ( const /*inner_iterator*/ & x,

const /*inner_iterator*/ & y )

requires forward_range < Base > ;
(1) (since C++20)
friend constexpr bool operator == ( const /*inner_iterator*/ & x,
std:: default_sentinel_t ) ;
(2) (since C++20)
1) Эквивалентно return x. i_ . /*cur*/ ( ) == y. i_ . /*cur*/ ( ) ; .
2) Тело функции эквивалентно
auto [pcur, pend] = ranges::subrange{x.i_.parent_->pattern_};
auto end = ranges::end(x.i_.parent_->base_);
if constexpr (/*tiny_range*/<Pattern>)
{
    const auto& cur = x.i_./*cur*/();
    if (cur == end)
        return true;
    if (pcur == pend)
        return x.incremented_;
    return *cur == *pcur;
}
else
{
    auto cur = x.i_./*cur*/();
    if (cur == end)
        return true;
    if (pcur == pend)
        return x.incremented_;
    do
    {
        if (*cur != *pcur)
            return false;
        if (++pcur == pend)
            return true;
    }
    while (++cur != end);
    return false;
}

Оператор != синтезируется из operator== .

Эти функции не видны при обычном неквалифицированном или квалифицированном поиске и могут быть найдены только с помощью поиска, зависимого от аргументов , когда std::ranges::split_view:: inner_iterator является ассоциированным классом аргументов.

iter_move (std::ranges::split_view:: inner_iterator )

friend constexpr decltype ( auto ) iter_move ( const /*inner_iterator*/ & i )
noexcept ( noexcept ( ranges:: iter_move ( i. i_ . /*cur*/ ( ) ) ) ) ;
(since C++20)

Эквивалентно return ranges:: iter_move ( i. i_ . /*cur*/ ( ) ) ; .

Эта функция не видна при обычном неквалифицированном поиске или квалифицированном поиске и может быть найдена только с помощью поиска, зависимого от аргументов , когда std::ranges::split_view:: inner_iterator является ассоциированным классом аргументов.

iter_swap (std::ranges::split_view:: inner_iterator )

friend constexpr void iter_swap ( const /*inner_iterator*/ & x,

const /*inner_iterator*/ & y )
noexcept ( noexcept ( ranges:: iter_swap ( x. i_ . current , y. i_ . current ) ) )

requires std:: indirectly_swappable < ranges:: iterator_t < Base >> ;
(since C++20)

Эквивалентно ranges:: iter_swap ( x. i_ . /*cur*/ ( ) , y. i_ . /*cur*/ ( ) ) .

Эта функция не видна при обычном неквалифицированном поиске или квалифицированном поиске и может быть найдена только с помощью поиска, зависимого от аргументов , когда std::ranges::split_view:: inner_iterator является ассоциированным классом аргументов.

Отчёты о дефектах

Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 3591 C++20 перегрузка && для base может инвалидировать внешние итераторы добавлены ограничения
LWG 3593 C++20 перегрузка const & для base возвращает ссылку, но может не быть noexcept сделано noexcept