Namespaces
Variants

std::experimental::ranges:: SizedSentinel

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

concept bool SizedSentinel =
Sentinel < S, I > &&
! ranges :: disable_sized_sentinel < std:: remove_cv_t < S > , std:: remove_cv_t < I >> &&
requires ( const I & i, const S & s ) {
{ s - i } - > Same < ranges :: difference_type_t < I >> && ;
{ i - s } - > Same < ranges :: difference_type_t < I >> && ;

} ;
(1) (ranges TS)
template < class S, class I >
constexpr bool disable_sized_sentinel = false ;
(1) (ranges TS)

Концепт SizedSentinel определяет, что объект типа итератора I и объект типа сторожа S могут быть вычитаны для вычисления расстояния между ними за постоянное время.

Пусть i будет итератором типа I , а s - cентинелом типа S , таких что [ i , s ) обозначает диапазон. Пусть N будет наименьшим количеством применений ++i , необходимых для того, чтобы bool ( i == s ) стало истинным. Тогда SizedSentinel<S, I> удовлетворяется только если:

  • Если N представимо в ranges :: difference_type_t < I > , тогда s - i корректно определено и равно N ; и
  • Если -N представимо в ranges :: difference_type_t < I > , тогда i - s корректно определено и равно -N .

Переменная шаблонная переменная disable_sized_sentinel предоставляет механизм для итераторов и стражей, которые могут вычитаться, но не удовлетворяют семантическим требованиям SizedSentinel , чтобы отказаться от концепции путем специализации переменной шаблонной переменной для значения true .

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

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

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

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

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

Вариации неявных выражений

Выражение requires-expression , использующее выражение, которое является немодифицирующим для некоторого константного lvalue операнда, также неявно требует дополнительных вариаций этого выражения, принимающих неконстантный lvalue или (возможно константный) rvalue для данного операнда, если только такая вариация выражения не требуется явно с отличающейся семантикой. Эти неявные вариации выражений должны удовлетворять тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариаций, не определена.