Именованные требования C++: LegacyIterator
Требования LegacyIterator описывают типы, которые можно использовать для идентификации и обхода элементов контейнера.
LegacyIterator — это базовый набор требований, используемый другими типами итераторов: LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator и LegacyRandomAccessIterator. Итераторы можно рассматривать как абстракцию указателей.
Для всех категорий итераторов требуются только те функции, реализация которых для данной категории выполняется за постоянное время (амортизированно). Поэтому в таблицах требований и определениях концептов(начиная с 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 определено) |
КонцептДля определения
Концепт __Referenceable<T>, используемый только для описания, удовлетворяется тогда и только тогда, когда T& является допустимым типом (в частности, | (начиная с C++20) |
Примечания
Примечание о терминологии: в следующей таблице приведены названия, используемые на этом сайте, и соответствующие им названия из стандарта C++ (с тем же значением). Префиксы «Legacy» (и «Cpp17») подчёркивают совместимость со стандартами, предшествующими C++20, и используются для отличия этих требований от новых концептов итераторов, введённых в C++20.
- Категория LegacyContiguousIterator была официально определена только в C++17, однако итераторы
std::vector,std::basic_string,std::arrayиstd::valarray, а также указатели на элементы массивов C часто рассматривались как отдельная категория в коде, написанном до C++17.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 2437 | C++98 |
*r должен быть reference | не требуется для выходных итераторов |
| LWG 3420 | C++20 | концепт, используемый только для описания, сначала проверяет copyable |
copyable проверяется только в том случае, если requires-выражение возвращает true |
См. также
|
(C++20) | задаёт требование, согласно которому объекты типа можно инкрементировать и разыменовывать (концепт) |
| Библиотека итераторов | предоставляет определения итераторов, характеристик итераторов, адаптеров и вспомогательных функций |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/Iterator