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() копирует или перемещает
(объект-член, представленный в качестве примера*)

Члены-функции

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

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

operator==operator<operator<=operator>operator>=operator<=>
(C++23)
сравнивает базовые итераторы
(шаблон функции)
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)

Примечания

Макрос проверки наличия функции Значение 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

Spec-Zone.ru

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