Namespaces
Variants

std::span<T,Extent>:: span

From cppreference.net
constexpr span ( ) noexcept ;
(1) (начиная с C++20)
template < class It >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( It first, size_type count ) ;
(2) (начиная с C++20)
template < class It, class End >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( It first, End last ) ;
(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 )

constexpr span ( R && r ) ;
(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 )

constexpr span ( const std:: span < U, N > & source ) noexcept ;
(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 :

1) extent == std:: dynamic_extent || extent == 0
4-6) extent == std:: dynamic_extent || extent == N
9) extent == std:: dynamic_extent || N == std:: dynamic_extent || extent == N


Если результат следующего выражения равен false , поведение не определено.

(до C++26)

Если результат следующего выражения равен false :

  • Если реализация является защищённой , происходит нарушение контракта . Более того, если обработчик нарушения контракта возвращает управление при семантике оценки "observe", поведение не определено.
  • Если реализация не является защищённой, поведение не определено.
(начиная с C++26)
2) extent == std:: dynamic_extent || extent == count
3) extent == std:: dynamic_extent || extent == last - first
7) extent == std:: dynamic_extent || extent == ranges:: size ( r )
8) extent == std:: dynamic_extent || extent == il. size ( )
9) extent == std:: dynamic_extent || extent == source. size ( )

Требования к преобразованию

Если element_type отличается от типа элементов исходного диапазона, и последний не может быть преобразован в первый с помощью квалификационного преобразования , объект span не может быть создан.

Эти перегрузки участвуют в разрешении перегрузки только если std:: is_convertible_v < U ( * ) [ ] , element_type ( * ) [ ] > равно true , где U определяется следующим образом:

4-6) std:: remove_pointer_t < decltype ( std:: data ( arr ) ) >
9) 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

Другие ограничения

2) Если [ first , first + count ) не является допустимым диапазоном , поведение не определено.
3) Эта перегрузка участвует в разрешении перегрузки только если std:: is_convertible_v < End, std:: size_t > равно false .
Если [ first , last ) не является допустимым диапазоном, поведение не определено.
7) Эта перегрузка участвует в разрешении перегрузки только при выполнении всех следующих условий:
8) Эта перегрузка участвует в разрешении перегрузки только если std:: is_const_v < element_type > равно true .

Исключения

2) Ничего не выбрасывает.
3) Выбрасывает что и когда last - first выбрасывает.
7) Что и когда выбрасывает std :: ranges:: size ( r ) и std :: ranges:: data ( r ) .

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__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)