Spec-Zone.ru › C++

std::sized_sentinel_for, std::disable_sized_sentinel_for

Определено в заголовке <iterator>
template< class S, class I >
    concept sized_sentinel_for =
        std::sentinel_for<S, I> &&
        !std::disable_sized_sentinel_for<std::remove_cv_t<S>, std::remove_cv_t<I>> &&
        requires(const I& i, const S& s) {
            { s - i } -> std::same_as<std::iter_difference_t<I>>;
            { i - s } -> std::same_as<std::iter_difference_t<I>>;
        };
(1) (с C++20)
template< class S, class I >
    inline constexpr bool disable_sized_sentinel_for = false;
(2) (с C++20)
1) Концепция sized_sentinel_for определяет, что объект типа итератора I и объект типа конечной точки S могут быть вычитаны для вычисления расстояния между ними за постоянное время.
2) Шаблонная переменная disable_sized_sentinel_for может использоваться для предотвращения того, чтобы итераторы и конечные точки, которые могут быть вычитаны, но фактически не моделируют sized_sentinel_for, удовлетворяли концепции.
Шаблонная переменная может быть специализирована для неквалифицированных по cv и не являющихся массивом типов объектов S и I, по крайней мере, один из которых является определённым в программе типом. Такие специализации должны быть применимы в константных выражениях и иметь тип const bool.

Семантические требования

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

  • Если n представимо std::iter_difference_t<I>, то s - i определено и равно n; и
  • Если -n представимо std::iter_difference_t<I>, то i - s определено и равно -n.
  • Вычитание между i и s имеет сложность выполнения за постоянное время.

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

Выражения, объявленные в выражениях `requires` стандартных концепций, должны быть сохраняющими равенство (за исключением случаев, когда указано иное).

Неявные вариации выражений

Выражение `requires`, использующее выражение, которое не изменяет некоторые константные ссылки на переменные, также требует неявных вариаций выражений.

См. также

ranges::sized_range
(C++20)
определяет, что диапазон знает свой размер за постоянное время
(концепция)
ranges::size
(C++20)
возвращает целое число, равное размеру диапазона
(объект точки кастомизации)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/iterator/sized_sentinel_for

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API