std::ranges:: sized_range, std::ranges:: disable_sized_range
|
Определено в заголовке
<ranges>
|
||
| (1) | ||
|
template
<
class
T
>
concept sized_range
=
ranges::
range
<
T
>
&&
|
(начиная с C++20)
(до C++26) |
|
|
template
<
class
T
>
concept sized_range
=
ranges
::
approximately_sized_range
<
T
>
&&
|
(начиная с C++26) | |
|
template
<
class
>
constexpr bool disable_sized_range = false ; |
(2) | (начиная с C++20) |
sized_range
определяет требования к типу
range
(до C++26)
approximately_sized_range
(начиная с C++26)
, который знает свой размер за константное время с помощью функции
size
.
disable_sized_range
существует для разрешения использования типов диапазонов, которые предоставляют функцию
size
(как член или как не-член), но фактически не моделируют
sized_range
. Пользователи могут специализировать
disable_sized_range
для програмно-определенных типов без cv-квалификаторов. Такие специализации должны быть применимы в
константных выражениях
и иметь тип
const
bool
.
Содержание |
Семантические требования
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
(концепт) |