Namespaces
Variants

std:: basic_const_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
basic_const_iterator
(C++23)
const_iterator
(C++23)
const_sentinel
(C++23)
make_const_iterator
(C++23)
make_const_sentinel
(C++23)

Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
Определено в заголовочном файле <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
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)
преобразует результат разыменования базового итератора в соответствующий тип 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 не следует конвертируемости своего базового типа предоставлен оператор преобразования