Namespaces
Variants

C++ named requirements: LegacyIterator

From cppreference.net
C++ named requirements

Требования LegacyIterator описывают типы, которые могут использоваться для идентификации и обхода элементов контейнера.

LegacyIterator — это базовый набор требований, используемый другими типами итераторов: LegacyInputIterator , LegacyOutputIterator , LegacyForwardIterator , LegacyBidirectionalIterator и LegacyRandomAccessIterator . Итераторы можно рассматривать как абстракцию указателей.

Все категории итераторов требуют только тех функций, которые реализуемы для данной категории за постоянное время (амортизированное). Поэтому таблицы требований и определения концепций (since C++20) для итераторов не специфицируют сложность.

Содержание

Требования

Тип It удовлетворяет LegacyIterator если

  • Тип It удовлетворяет требованиям CopyConstructible , и
  • Тип It удовлетворяет требованиям CopyAssignable , и
  • Тип It удовлетворяет требованиям Destructible , и
  • Тип It удовлетворяет требованиям Swappable , и
  • std:: iterator_traits < It > имеет члены-типы: value_type , (до C++20) difference_type , reference , pointer , и iterator_category , и
  • Для r , lvalue типа It , следующие выражения должны быть корректны и иметь указанные эффекты:
Выражение Тип возвращаемого значения Предусловие
* r неопределён r является разыменовываемым
++ r It & r является инкрементируемым (поведение выражения ++ r определено)

Концепт

Для определения std::iterator_traits определяется следующий концепт, используемый только для демонстрации.

template < class I >

concept __LegacyIterator =
requires ( I i )
{
{ * i } - > __Referenceable ;
{ ++ i } - > std:: same_as < I & > ;
{ * i ++ } - > __Referenceable ;

} && std:: copyable < I > ;

где концепт, используемый только для демонстрации __Referenceable < T > удовлетворяется тогда и только тогда, когда T & является допустимым типом (в частности, T не должен быть void ).

(начиная с C++20)

Примечания

Примечание по терминологии: следующая таблица показывает названия, используемые на этом сайте, и соответствующие названия из стандарта C++ (с тем же значением). Префикс "Legacy" (и «Cpp17») подчеркивает совместимость со стандартами до C++20 и используется для отличия этих требований от новых концепций итераторов введенных в C++20.

названия cppreference названия стандарта C++ концепции итераторов C++20
LegacyIterator Cpp17Iterator input_or_output_iterator
LegacyInputIterator Cpp17InputIterator input_iterator
LegacyOutputIterator Cpp17OutputIterator output_iterator
LegacyForwardIterator Cpp17ForwardIterator forward_iterator
LegacyBidirectionalIterator Cpp17BidirectionalIterator bidirectional_iterator
LegacyRandomAccessIterator Cpp17RandomAccessIterator random_access_iterator
LegacyContiguousIterator [1] contiguous_iterator
  1. LegacyContiguousIterator категория была формально определена только в C++17, однако итераторы std::vector , std::basic_string , std::array и std::valarray , а также указатели на массивы C часто рассматривались как отдельная категория в коде до C++17.

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2437 C++98 * r требуется, чтобы был reference не требуется для output iterators
LWG 3420 C++20 экспозиционная концепция проверяет copyable сначала copyable проверяется только если requires-expression возвращает true

Смотрите также

определяет, что объекты типа могут быть инкрементированы и разыменованы
(концепт)
Iterator library предоставляет определения для итераторов, характеристик итераторов, адаптеров и служебных функций