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() копирует или перемещает(объект-член, представленный в качестве примера*) |
Члены-функции
| создаёт новый адаптер итератора (общедоступная функция-член) |
|
| присваивает другой адаптер итератора (общедоступная функция-член) |
|
| обращается к базовому итератору (общедоступная функция-член) |
|
| обращается к указанному элементу (общедоступная функция-член) |
|
| обращается к элементу по индексу (общедоступная функция-член) |
|
| продвигает или уменьшает итератор (общедоступная функция-член) |
|
|
(C++23) | преобразует в любой константный итератор, в который может быть преобразован базовый итератор (общедоступная функция-член) |
Функции, не являющиеся членами
|
(C++23) | сравнивает базовые итераторы (шаблон функции) |
|
(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) |
Примечания
| Макрос проверки наличия функции | Значение | Std | Функция |
|---|---|---|---|
__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
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.base()[0] = 42; // OK, underlying iterator is writable
}Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам 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/w/cpp/iterator/basic_const_iterator