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
(public member function) |
|
|
получает доступ к базовому итератору
(public member function) |
|
|
получает доступ к указываемому элементу
(public member function) |
|
|
получает доступ к элементу по индексу
(public member function) |
|
|
перемещает или уменьшает итератор
(public member function) |
|
|
преобразует в любой константный итератор, в который может быть преобразован базовый итератор
(public member function) |
|
|
сравнивает базовые итераторы
(public member function) |
Функции, не являющиеся членами класса
сравнивает
basic_const_iterator
с не-
basic_const_iterator
(шаблон функции) |
|
|
(C++23)
|
перемещает или уменьшает итератор
(шаблон функции) |
|
(C++23)
|
вычисляет расстояние между двумя адаптерами итераторов
(шаблон функции) |
|
(C++23)
|
преобразует результат разыменования базового итератора в соответствующий тип rvalue-ссылки
(функция) |
Вспомогательные классы
определяет общий тип итератора и адаптированного
basic_const_iterator
типа
(специализация шаблона класса) |
Вспомогательные псевдонимы шаблонов
|
template
<
std::
input_iterator
I
>
using const_iterator = /* см. описание */ ; |
(начиная с C++23) | |
Если
I
моделирует
constant-iterator
(экспозиционная концепция), то
const_iterator
<
I
>
обозначает тип
I
. В противном случае,
basic_const_iterator
<
I
>
.
|
template
<
std::
semiregular
S
>
using const_sentinel = /* см. описание */ ; |
(начиная с 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 i[1] = 4; // OK, то же самое что *(i + 1) = 4; auto ci = std::make_const_iterator(i); assert(*ci == 4); // OK, можно читать базовый объект assert(ci[0] == 4); // OK, аналогично // *ci = 13; // Ошибка: расположение доступно только для чтения // ci[0] = 13; // Ошибка: аналогично ci.base()[0] = 42; // OK, базовый итератор доступен для записи assert(*ci == 42); // OK, базовое расположение v[0] было изменено }
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2836R1 | C++23 |
basic_const_iterator
не следует конвертируемости своего базового типа
|
предоставлен оператор преобразования |