Spec-Zone.ru › C++

std::basic_const_iterator

Определён в заголовочном файле <iterator>
template< std::input_iterator Iter >
class basic_const_iterator;
(начиная с C++23)

std::basic_const_iterator — это адаптер итератора, который ведёт себя точно так же, как базовый итератор (который должен быть как минимум LegacyInputIterator или моделировать input_iterator), за исключением того, что разыменование преобразует возвращаемое базовым итератором значение в неизменяемое. Специализации std::basic_const_iterator являются константными итераторами, то есть их нельзя использовать как выходные итераторы, поскольку изменение элементов не допускается.

Типы-члены

Тип-член Определение
iterator_category
(присутствует при выполнении условия)

Если Iter моделирует forward_iterator:

  • член iterator_category имеет тот же тип, что и std::iterator_traits<Iter>::iterator_category.

В противном случае член iterator_category отсутствует.

iterator_concept
  • std::contiguous_iterator_tag, если Iter моделирует contiguous_iterator;
  • std::random_access_iterator_tag, если Iter моделирует random_access_iterator;
  • std::bidirectional_iterator_tag, если Iter моделирует bidirectional_iterator;
  • std::forward_iterator_tag, если Iter моделирует forward_iterator;
  • std::input_iterator_tag в противном случае.
value_type std::iter_value_t<Iter>
difference_type std::iter_difference_t<Iter>
reference (закрытый) std::iter_const_reference_t<Iter>
(тип-член, используемый только для описания*)

Объекты-члены

Имя члена Определение
current (закрытый) базовый итератор, из которого base() копирует или перемещает значение
(объект-член, используемый только для описания*)

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

(конструктор)
создаёт новый basic_const_iterator
(открытая функция-член)
base
получает доступ к базовому итератору
(открытая функция-член)
operator*operator->
получает доступ к элементу, на который указывает итератор
(открытая функция-член)
operator[]
получает доступ к элементу по индексу
(открытая функция-член)
operator++operator++(int)operator+=operator--operator--(int)operator-=
перемещает итератор вперёд или назад
(открытая функция-член)
operator constant-iterator
преобразует в любой константный итератор, к которому может быть преобразован базовый итератор
(открытая функция-член)
operator==operator<operator>operator<=operator>=operator<=>
сравнивает базовые итераторы
(открытая функция-член)

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

operator<operator>operator<=operator>=operator<=>
(C++23)
сравнивает basic_const_iterator с не-basic_const_iterator
(шаблон функции)
operator+operator-
(C++23)
перемещает итератор вперёд или назад
(шаблон функции)
operator-
(C++23)
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции)
iter_move
(C++23)
приводит результат разыменования базового итератора к соответствующему типу rvalue-ссылки
(функция)

Вспомогательные классы

std::common_type<std::basic_const_iterator>
(C++23)
определяет общий тип итератора и адаптированного типа basic_const_iterator
(специализация шаблона класса)

Вспомогательные шаблоны псевдонимов

template< std::input_iterator I >
using const_iterator = /* see description */;
(начиная с C++23)

Если I моделирует constant-iterator (концепт, используемый только для описания), то const_iterator<I> обозначает тип I. В противном случае basic_const_iterator<I>.

template< std::semiregular S >
using const_sentinel = /* see description */;
(начиная с C++23)

Если S моделирует input_iterator, то const_sentinel<S> обозначает тип const_iterator<S>. В противном случае S.

Вспомогательные шаблоны функций

template< std::input_iterator T >
constexpr const_iterator<T> make_const_iterator( I it ) { return it; }
(начиная с C++23)
template< std::semiregular S >
constexpr const_sentinel<S> make_const_sentinel( S s ) { return s; }
(начиная с C++23)

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_as_const 202207L (C++23) std::basic_const_iterator
202311L (C++23)
(DR)
std::basic_const_iterator должен следовать правилам преобразования своего базового типа

Пример

#include <cassert>
#include <iterator>
#include <vector>

int main()
{
    std::vector v{1, 2, 3};
    std::vector<int>::iterator i = v.begin();
    *i = 4;   // OK, v[0] == 4 now
    i[1] = 4; // OK, the same as *(i + 1) = 4;

    auto ci = std::make_const_iterator(i);
    assert(*ci == 4);   // OK, can read the underlying object
    assert(ci[0] == 4); // OK, ditto
    // *ci = 13;        // Error: location is read-only
    // ci[0] = 13;      // Error: ditto
    ci.base()[0] = 42;  // OK, underlying iterator is writable
    assert(*ci == 42);  // OK, underlying location v[0] was modified
}

Отчёты об ошибках

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

DR Применяется к Опубликованное поведение Корректное поведение
P2836R1 C++23 basic_const_iterator не следует правилам преобразования своего базового типа предоставлен оператор преобразования

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/const_sentinel

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API