Namespaces
Variants

std::experimental::ranges:: BidirectionalIterator

From cppreference.net
Определено в заголовочном файле <experimental/ranges/iterator>
template < class I >

concept bool BidirectionalIterator =
ForwardIterator < I > &&
DerivedFrom < ranges :: iterator_category_t < I > , ranges :: bidirectional_iterator_tag > &&
requires ( I i ) {
{ -- i } - > Same < I > & ;
{ i -- } - > Same < I > && ;

} ;
(ranges TS)

Концепт BidirectionalIterator<I> расширяет ForwardIterator , добавляя возможность перемещения итератора в обратном направлении.

Двунаправленный итератор r называется декрементируемым тогда и только тогда, когда существует некоторый s такой, что ++ s == r . Все декрементируемые итераторы r должны находиться в области определения выражений -- r и r -- .

Пусть a и b будут декрементируемыми объектами типа I . BidirectionalIterator<I> удовлетворяется только если:

  • Префиксный декремент возвращает lvalue, ссылающееся на операнд: std:: addressof ( -- a ) == std:: addressof ( a ) .
  • Постфиксный декремент возвращает предыдущее значение операнда: если bool ( a == b ) , то bool ( a -- == b ) .
  • Постфиксный и префиксный декремент выполняют одинаковое изменение операнда: если bool ( a == b ) , то после вычисления как a -- , так и -- b , bool ( a == b ) остаётся истинным.
  • Инкремент и декремент являются обратными операциями друг для друга:
  • Если a инкрементируем и bool ( a == b ) , тогда bool ( -- ( ++ a ) == b ) .
  • Если bool ( a == b ) , тогда bool ( ++ ( -- a ) == b ) .

Сохранение равенства

Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.

  • Входные данные выражения состоят из его операндов.
  • Выходные данные выражения состоят из его результата и всех операндов, изменённых выражением (если таковые имеются).

Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные выходные данные при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.

Если не указано иное, каждое выражение, используемое в requires-expression , должно сохранять равенство и быть стабильным, и вычисление выражения может изменять только свои неконстантные операнды. Операнды, являющиеся константными, не должны изменяться.