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.
Программа может специализировать disable_sized_sentinel_for для неконстантного и невольатильного типа объекта без массива S и I при условии, что хотя бы один из них является типом, определённым программой. Такие специализации можно использовать в константных выражениях; они имеют тип constbool.

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

Пусть 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.

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

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

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

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

См. также

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/cpp/iterator/sized_sentinel_for

Spec-Zone.ru

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