std::span<T,Extent>:: span
|
constexpr
span
(
)
noexcept
;
|
(1) | (начиная с C++20) |
|
template
<
class
It
>
explicit
(
extent
!
=
std::
dynamic_extent
)
|
(2) | (начиная с C++20) |
|
template
<
class
It,
class
End
>
explicit
(
extent
!
=
std::
dynamic_extent
)
|
(3) | (начиная с C++20) |
|
template
<
std::
size_t
N
>
constexpr span ( std:: type_identity_t < element_type > ( & arr ) [ N ] ) noexcept ; |
(4) | (начиная с C++20) |
|
template
<
class
U,
std::
size_t
N
>
constexpr span ( std:: array < U, N > & arr ) noexcept ; |
(5) | (начиная с C++20) |
|
template
<
class
U,
std::
size_t
N
>
constexpr span ( const std:: array < U, N > & arr ) noexcept ; |
(6) | (начиная с C++20) |
|
template
<
class
R
>
explicit
(
extent
!
=
std::
dynamic_extent
)
|
(7) | (начиная с C++20) |
|
explicit
(
extent
!
=
std::
dynamic_extent
)
constexpr span ( std:: initializer_list < value_type > il ) noexcept ; |
(8) | (начиная с C++26) |
|
template
<
class
U,
std::
size_t
N
>
explicit
(
extent
!
=
std::
dynamic_extent
&&
N
==
std::
dynamic_extent
)
|
(9) | (начиная с C++20) |
|
constexpr
span
(
const
span
&
other
)
noexcept
=
default
;
|
(10) | (начиная с C++20) |
Создает
span
.
Содержание |
Параметры
| first | - | итератор на первый элемент последовательности |
| count | - | количество элементов в последовательности |
| last | - | итератор за последним элементом последовательности или другой страж |
| arr | - | массив для создания представления |
| r | - | диапазон для создания представления |
| source | - |
другой
span
для преобразования
|
| other | - |
другой
span
для копирования
|
Эффекты
| Перегрузка |
data()
после конструирования
|
size()
после конструирования
|
|---|---|---|
| ( 1 ) | nullptr | 0 |
| ( 2 ) | std:: to_address ( first ) | count |
| ( 3 ) | last - first | |
| ( 4 ) | std:: data ( arr ) | N |
| ( 5 ) | ||
| ( 6 ) | ||
| ( 7 ) | ranges:: data ( r ) | ranges:: size ( r ) |
| ( 8 ) | il. begin ( ) | il. size ( ) |
| ( 9 ) | source. data ( ) | source. size ( ) |
| ( 10 ) | other. data ( ) | other. size ( ) |
Ограничения и дополнительная информация
Требования к размеру
Если
extent
не является
std::
dynamic_extent
и размер исходного диапазона отличается от
extent
, объект
span
не может быть создан.
Эти перегрузки участвуют в разрешении перегрузки только если результат следующего выражения true :
|
Если результат следующего выражения равен false , поведение не определено. |
(до C++26) |
|
Если результат следующего выражения равен false :
|
(начиная с C++26) |
Требования к преобразованию
Если
element_type
отличается от типа элементов исходного диапазона, и последний не может быть преобразован в первый с помощью
квалификационного преобразования
, объект
span
не может быть создан.
Эти перегрузки участвуют в разрешении перегрузки только если
std::
is_convertible_v
<
U
(
*
)
[
]
, element_type
(
*
)
[
]
>
равно
true
, где
U
определяется следующим образом:
U
Требования концепций
Если какой-либо шаблонный аргумент не моделирует определённые концепции, объект
span
не может быть создан.
Эти перегрузки участвуют в разрешении перегрузки только в том случае, если аргумент шаблона, соответствующий указанному параметру шаблона, удовлетворяет соответствующему концепту(ам). Если он не удовлетворяет семантическим требованиям любого соответствующего концепта, поведение не определено:
| Перегрузка |
Шаблонный
параметр |
Концепт | Примечание |
|---|---|---|---|
| ( 2 ) |
It
|
contiguous_iterator
|
|
| ( 3 ) |
It
|
contiguous_iterator
|
|
End
|
sized_sentinel_for<It>
|
||
| ( 7 ) |
R
|
contiguous_range
|
|
sized_range
|
|||
borrowed_range
|
требуется только если std:: is_const_v < element_type > равно false |
Другие ограничения
[
first
,
last
)
не является допустимым диапазоном, поведение не определено.
-
std::
remove_cvref_t
<
R
>
не является специализацией
std::spanили std::array . - std:: is_array_v < std:: remove_cvref_t < R >> равно false .
Исключения
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_span_initializer_list
|
202311L
|
(C++26) |
Конструирование
std::span
из
std::initializer_list
,
(
8
)
|
Пример
#include <array> #include <iostream> #include <span> #include <vector> void print_span(std::span<const int> s) { for (int n : s) std::cout << n << ' '; std::cout << '\n'; } int main() { int c[]{1, 2, 3}; print_span(c); // создается из массива std::array a{4, 5, 6}; print_span(a); // создается из std::array std::vector v{7, 8, 9}; print_span(v); // создается из std::vector #if __cpp_lib_span_initializer_list print_span({0, 1, 2}); // создается из initializer_list #else print_span({{0, 1, 2}}); // то же самое, обходное решение #endif }
Вывод:
1 2 3 4 5 6 7 8 9 0 1 2
Смотрите также
|
прямой доступ к базовому непрерывному хранилищу
(public member function) |
|
|
возвращает количество элементов
(public member function) |
|
присваивает
span
(public member function) |
|
|
(C++17)
(C++20)
|
возвращает размер контейнера или массива
(function template) |
|
(C++17)
|
получает указатель на базовый массив
(function template) |