Namespaces
Variants

C++ named requirements: LegacyRandomAccessIterator

From cppreference.net
C++ named requirements

LegacyRandomAccessIterator — это LegacyBidirectionalIterator , который может быть перемещён для указания на любой элемент за константное время.

Если LegacyRandomAccessIterator it происходит из Container , тогда it 's value_type совпадает с контейнерным, поэтому разыменование ( * it ) возвращает value_type контейнера.

Указатель на элемент массива удовлетворяет всем требованиям LegacyRandomAccessIterator .

Содержание

Требования

Тип It удовлетворяет требованиям LegacyRandomAccessIterator если

И, учитывая

  • value_type , тип, обозначаемый std:: iterator_traits < It > :: value_type
  • difference_type , тип, обозначаемый std:: iterator_traits < It > :: difference_type
  • reference , тип, обозначаемый std:: iterator_traits < It > :: reference
  • i , a , b , объекты типа It или const It
  • r , lvalue типа It
  • n , целое число типа difference_type

Следующие выражения должны быть корректными и иметь указанные эффекты:

Выражение Тип возвращаемого значения Операционная семантика Примечания
r + = n It& difference_type m = n ;

if ( m >= 0 ) while ( m -- ) ++ r ;
else while ( m ++ ) -- r ;
return r ;

  • n может быть как положительным, так и отрицательным
  • Сложность является константной (то есть реализация не может фактически выполнять цикл while, показанный в операционной семантике)
a + n

n + a

It It temp = a ;

return temp + = n ;

  • n может быть как положительным, так и отрицательным
  • a + n == n + a
r - = n It& return r + = - n ; Абсолютное значение n должно находиться в диапазоне представимых значений difference_type .
i - n Это It temp = i ;
return temp - = n ;
b - a difference_type return n ;
(см. предусловие)

Предусловие:

  • существует значение n типа difference_type такое, что a + n == b

Постусловие:

  • b == a + ( b - a ) .
i [ n ] преобразуется в reference * ( i + n )
a < b

соответствует BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
Эквивалентно return b - a > 0 ; Предусловие:
  • такое же, как у b - a

Отношение строгого полного порядка:

  • ! ( a < a )
  • если a < b тогда ! ( b < a )
  • если a < b и b < c тогда a < c
  • a < b или b < a или a == b
    (ровно одно из выражений истинно)
a > b

соответствует BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
b < a Отношение полного порядка, противоположное a < b
a >= b

соответствует BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
! ( a < b )
a <= b

соответствует требованиям BooleanTestable

(до C++20)

моделирует boolean-testable

(начиная с C++20)
! ( a > b )

Вышеуказанные правила подразумевают, что LegacyRandomAccessIterator также реализует LessThanComparable .

Изменяемый LegacyRandomAccessIterator — это LegacyRandomAccessIterator , который дополнительно удовлетворяет требованиям LegacyOutputIterator .

Концепт

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

template < class I >

concept __LegacyRandomAccessIterator =
__LegacyBidirectionalIterator < I > && std:: totally_ordered < I > &&
requires ( I i, typename std:: incrementable_traits < I > :: difference_type n )
{
{ i + = n } - > std:: same_as < I & > ;
{ i - = n } - > std:: same_as < I & > ;
{ i + n } - > std:: same_as < I > ;
{ n + i } - > std:: same_as < I > ;
{ i - n } - > std:: same_as < I > ;
{ i - i } - > std:: same_as < decltype ( n ) > ;
{ i [ n ] } - > std:: convertible_to < std:: iter_reference_t < I >> ;

} ;

где концепт, используемый только для демонстрации, __LegacyBidirectionalIterator описан в LegacyBidirectionalIterator .

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

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

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

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 299
( N3066 )
C++98 возвращаемый тип a [ n ] требовал
конвертируемости в const value_type &
возвращаемый тип должен быть
конвертируем в reference
LWG 448 C++98 возвращаемый тип a [ n ] требовал
конвертируемости в value_type
возвращаемый тип должен быть
конвертируем в const value_type & [1]
LWG 1079 C++98 b - a определялось через a < b ,
что приводило к циклическому определению
исключено a < b из определения
LWG 2114
( P2167R3 )
C++98 конвертируемость в bool была слишком слабой для отражения ожиданий реализаций требования усилены
  1. LWG issue 299 был переоткрыт после данного решения.

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

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