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(присутствует при выполнении условия) | Если
В противном случае член |
iterator_concept |
|
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 (открытая функция-член) |
|
| получает доступ к базовому итератору (открытая функция-член) |
|
| получает доступ к элементу, на который указывает итератор (открытая функция-член) |
|
| получает доступ к элементу по индексу (открытая функция-член) |
|
| перемещает итератор вперёд или назад (открытая функция-член) |
|
| преобразует в любой константный итератор, в который можно преобразовать базовый итератор (открытая функция-член) |
|
| сравнивает базовые итераторы (открытая функция-член) |
Функции, не являющиеся членами
|
(C++23) | сравнивает basic_const_iterator с типом, не являющимся basic_const_iterator (шаблон функции) |
|
(C++23) | перемещает итератор вперёд или назад (шаблон функции) |
|
(C++23) | вычисляет расстояние между двумя адаптерами итераторов (шаблон функции) |
|
(C++23) | приводит результат разыменования базового итератора к связанному с ним типу rvalue-ссылки (функция) |
Вспомогательные классы
|
(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/basic_const_iterator