std::ranges::sized_range, std::ranges::disable_sized_range
Материал из ru.cppreference.net
| Определён в заголовочном файле <ranges>
|
||
template< class T >
concept sized_range = ranges::range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(1) | (начиная с C++20) (до C++26) |
template< class T >
concept sized_range = ranges::approximately_sized_range<T> &&
requires(T& t) {
ranges::size(t);
};
|
(начиная с C++26) | |
template< class >
constexpr bool disable_sized_range = false;
|
(2) | (начиная с C++20) |
1) Концепт
sized_range задаёт требования к типу диапазона(до C++26)approximately_sized_range(начиная с C++26), который знает свой размер за константное время с помощью функции 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 ) (другими словами, однонаправленный sized range может поддерживать вызов size только до первого вызова begin, но forward range должен поддерживать size в любое время).
Примечания
disable_sized_range
не может использоваться для отключения диапазона, чей итератор и страж-элемент удовлетворяют
sized_sentinel_for
;
std::disable_sized_sentinel_for
должен использоваться вместо этого.
disable_sized_range
не может быть специализирован для типов массивов или ссылочных типов.
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges_reserve_hint
|
202502L
|
(C++26) | ranges::approximately_sized_range и ranges::reserve_hint |
Пример
Запустить этот код
#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() {}
Смотрите также
|
(C++20)
|
определяет диапазон, тип итератора которого удовлетворяет
random_access_iterator
(концепт) |
|
(C++20)
|
определяет диапазон, тип итератора которого удовлетворяет
contiguous_iterator
(концепт) |