std::ranges:: size
|
Определено в заголовке
<ranges>
|
||
|
Определено в заголовке
<iterator>
|
||
|
inline
namespace
/* unspecified */
{
inline
constexpr
auto
size
=
/* unspecified */
;
|
(since C++20)
(объект точки кастомизации) |
|
|
Сигнатура вызова
|
||
|
template
<
class
T
>
requires
/* see below */
|
(since C++20) | |
Вычисляет количество элементов в t за постоянное время.
Для подвыражения, в котором
subexpression
обозначает (возможно
материализованный
) результирующий объект как
t
, и тип
E
как
T
:
-
Если
Tявляется массивом неизвестной границы, ranges :: size ( E ) является некорректной конструкцией. -
В противном случае, если
Tявляется типом массива, ranges :: size ( E ) является эквивалентным по выражению decay-copy ( std:: extent_v < T > ) (до C++23) auto ( std:: extent_v < T > ) (начиная с C++23) . -
В противном случае, если выполняются все следующие условия,
ranges
::
size
(
E
)
является эквивалентным по выражению
decay-copy
(
t.
size
(
)
)
(до C++23)
auto
(
t.
size
(
)
)
(начиная с C++23)
:
- ranges:: disable_sized_range < std:: remove_cv_t < T >> равно false .
- decay-copy ( t. size ( ) ) (до C++23) auto ( t. size ( ) ) (начиная с C++23) является допустимым выражением целочисленного типа .
-
В противном случае, если выполняются все следующие условия,
ranges
::
size
(
E
)
является эквивалентным по выражению
decay-copy
(
size
(
t
)
)
(до C++23)
auto
(
size
(
t
)
)
(начиная с C++23)
:
-
Tявляется типом класса или перечисления. - ranges:: disable_sized_range < std:: remove_cv_t < T >> равно false .
-
decay-copy
(
size
(
t
)
)
(до C++23)
auto
(
size
(
t
)
)
(начиная с C++23)
является допустимым выражением целочисленного типа, где значение
sizeустанавливается как если бы выполнялся только поиск, зависимый от аргументов .
-
-
В противном случае, если выполняются все следующие условия,
ranges
::
size
(
E
)
является эквивалентным по выражению
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) :-
Tмоделируетforward_range. -
При условии, что тип
ranges::
begin
(
t
)
обозначен как
I, а тип ranges:: end ( t ) обозначен какS, оба условияsized_sentinel_for< S, I > иforward_iterator< I > выполнены. -
to-unsigned-like ( ranges:: end ( t ) - ranges:: begin ( t ) ) является допустимым выражением.
-
- В противном случае, ranges :: size ( E ) является некорректно сформированным.
Вышеуказанные диагностируемые случаи с нарушением формата приводят к неудаче подстановки когда ranges :: size ( E ) появляется в непосредственном контексте инстанцирования шаблона.
Содержание |
Объекты точек кастомизации
Имя
ranges::size
обозначает
объект точки кастомизации
, который является константным
функциональным объектом
типа
литерального
semiregular
класса. Для подробностей см.
CustomizationPointObject
.
Примечания
Всякий раз, когда ranges :: size ( e ) является валидным для выражения e , возвращаемый тип является integer-like .
Стандарт C++20 требует, чтобы если базовый вызов функции
size
возвращает prvalue, возвращаемое значение конструируется перемещением из материализованного временного объекта. Все реализации напрямую возвращают prvalue вместо этого. Требование исправлено пост-C++20 предложением
P0849R8
для соответствия реализациям.
Выражение ranges:: distance ( e ) также может использоваться для определения размера диапазона e . В отличие от ranges :: size ( e ) , ranges:: distance ( e ) работает даже если e является диапазоном без размера, ценой линейной сложности в этом случае.
Пример
#include <iostream> #include <ranges> #include <type_traits> #include <vector> int main() { auto v = std::vector<int>{}; std::cout << "ranges::size(v) == " << std::ranges::size(v) << '\n'; auto il = {7}; // std::initializer_list std::cout << "ranges::size(il) == " << std::ranges::size(il) << '\n'; int array[]{4, 5}; // array has a known bound std::cout << "ranges::size(array) == " << std::ranges::size(array) << '\n'; static_assert(std::is_signed_v<decltype(std::ranges::size(v))> == false); }
Вывод:
ranges::size(v) == 0 ranges::size(il) == 1 ranges::size(array) == 2
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2602R2 | C++20 |
there's machinery to prohibit certain non-member
size
found by
ADL
|
removed such machinery |
Смотрите также
|
(C++20)
|
возвращает знаковое целое число, равное размеру диапазона
(объект точки кастомизации) |
|
(C++20)
|
указывает, что диапазон знает свой размер за постоянное время
(концепт) |
|
(C++20)
|
возвращает расстояние между итератором и стражем, или между началом и концом диапазона
(функциональный объект алгоритма) |
|
(C++17)
(C++20)
|
возвращает размер контейнера или массива
(шаблон функции) |