Spec-Zone.ru › C++

std::ranges::sized_range, std::ranges::disable_sized_range

Определено в заголовке <ranges>
template< class T >
concept sized_range = ranges::range<T> &&
    requires(T& t) {
        ranges::size(t);
    };
(1) (с C++20)
template< class >
inline constexpr bool disable_sized_range = false;
(2) (с C++20)
1) Концепция sized_range задаёт требования к типу range, который знает свой размер за постоянное время с помощью функции size.
2) disable_sized_range существует для возможности использования типов диапазонов, которые предоставляют функцию size (как член или как нечлен), но фактически не моделируют sized_range. Пользователи могут специализировать disable_sized_range для типов, определённых программой, без квалификаторов cv. Такие специализации могут использоваться в постоянных выражениях и иметь тип const bool.

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

1) Учитывая lvalue t типа std::remove_reference_t<T>, T моделирует sized_range только если
  • ranges::size(t)
    • имеет амортизированную сложность за постоянное время,
    • не изменяет значение t таким образом, чтобы это было заметно для эквивалентных выражений, и
    • равно ranges::distance(ranges::begin(t), ranges::end(t)), и
  • если ranges::iterator_t<T> моделирует forward_iterator, ranges::size(t) определено независимо от вычисления ranges::begin(t) (другими словами, диапазон с размером, пропускающий один проход, может поддерживать вызов size только перед первым вызовом begin, но диапазон с направленным итератором должен поддерживать size во все моменты времени).

Примечания

disable_sized_range не может быть использована для отказа от диапазона, у которого итератор и конечная точка удовлетворяют sized_sentinel_for; для этого следует использовать std::disable_sized_sentinel_for.

disable_sized_range не может быть специализирована для типов массивов или ссылок.

Пример

#include <forward_list>
#include <list>
#include <ranges>
 
static_assert
(
    std::ranges::sized_range<std::list<int>> and
    not std::ranges::sized_range<std::forward_list<int>>
);
 
int main() {}

См. также

ranges::random_access_range
(C++20)
определяет диапазон, у которого тип итератора удовлетворяет random_access_iterator
(концепция)
ranges::contiguous_range
(C++20)
определяет диапазон, у которого тип итератора удовлетворяет contiguous_iterator
(концепция)

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

Spec-Zone.ru

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