std::span<T,Extent>::span
来自cppreference.com
                    
                                        
                    
                    
                                                            
                    |   constexpr span() noexcept;  | 
(1) | |
|   template< class It > explicit(extent != std::dynamic_extent)  | 
(2) | |
|   template< class It, class End > explicit(extent != std::dynamic_extent)  | 
(3) | |
|   template< std::size_t N > constexpr span( element_type (&arr)[N] ) noexcept;  | 
(4) | |
|   template< class U, std::size_t N > constexpr span( std::array<U, N>& arr ) noexcept;  | 
(5) | |
|   template< class U, std::size_t N > constexpr span( const std::array<U, N>& arr ) noexcept;  | 
(6) | |
|   template< class R > explicit(extent != std::dynamic_extent)  | 
(7) | |
|   template< class U, std::size_t N > explicit(extent != std::dynamic_extent && N == std::dynamic_extent)  | 
(8) | |
|   constexpr span( const span& other ) noexcept = default;  | 
(9) | |
构造 span 。
1) 构造空 span 使其 data() == nullptr 而 size() == 0 。
- 此重载只有在extent == 0 || extent == std::dynamic_extent时才会参与重载决议。
 
2) 构造作为范围 
[first, first + count) 上的视图的 span ;产生的 span 有 data() == std::to_address(first) 与 size() == count 。
-  若 
[first, first + count)不是合法范围,若It不实际实现contiguous_iterator或若 extent != std::dynamic_extent && count != extent 则行为未定义。这些重载只有在 
It满足contiguous_iterator- 从 std::iter_reference_t<It> 到 element_type 的转换至多为限定转换
 
3) 构造作为范围 
[first, last) 上的视图的 span ;产生的 span 有 data() == std::to_address(first) 与 size() == last-first 。若 [first, last) 不是合法范围,若 It 不实际实现 contiguous_iterator ,若 End 不实际实现 It 的 sized_sentinel_for ,或若 extent != std::dynamic_extent && last-first != extent 则行为未定义。
- 此重载只有在
 
-  
It满足contiguous_iterator, -  
End满足It的sized_sentinel_for, - 从 std::iter_reference_t<It> 到 element_type 的转换至多为限定转换,且
 - std::is_convertible_v<End, std::size_t> 为 false
 
-  
 
4-6) 构造作为数组 
arr 上的视图的 span ;产生的 span 有 size() == N 与 data() == std::data(arr) 。
- 这些重载只有在extent == std::dynamic_extent || N == extent 为 true 且从 std::remove_pointer_t<decltype(std::data(arr))> 到 element_type 的转换至多为限定转换时才会参与重载决议。这些构造函数模板决不用于类模板实参推导。
 
7) 构造作为范围 
range 上的视图的 span ;产生的 span 有 size() == std::ranges::size(r) 与 data() == std::ranges::data(range) 。
-  若 
R不实际实现contiguous_range与sized_range或当 element_type 为非 const 时R不实际实现borrowed_range或 extent != dynamic_extent 与 std::ranges::size(range) != extent 均为 true 则行为未定义。 - 此重载只有在
 
- extent == dynamic_extent ;
 -  
R满足contiguous_range与sized_range, -  
R满足borrowed_range或 std::is_const_v<element_type> 为 true -  std::remove_cvref_t<R> 不是 
std::span的特化, - std::remove_cvref_t<R> 不是 std::array 的特化,
 - std::is_array_v<std::remove_cvref_t<R>> 为 false ,且
 - 从 std::ranges::range_reference_t<R> 到 element_type 的转换至多为限定转换
 
8) 从另一 span 
source 的转换构造函数;产生的 span 有 size() == source.size() 与 data() == source.data() 。
- 若 extent != dynamic_extent 与 source.size() != extent 均为 true 则行为未定义。
 -  此重载只有在extent == std::dynamic_extent 、 N == std::dynamic_extent 与 N == extent 至少一者为 true 且从 
U到 element_type 的转换至多为限定转换时才会参与重载决议。 
9) 默认化的赋值构造函数复制大小与数据指针;产生的 span 有 size() == other.size() 与 data() == other.data() 。
参数
| first | - | 指向序列首元素的迭代器 | 
| count | - | 序列的元素数 | 
| last | - | 指向序列末元素后一位置的迭代器或另一哨位 | 
| arr | - | 用于构造视图的数组 | 
| range | - | 用于构造视图的范围 | 
| source | - | 要转换的另一 span | 
| other | - | 要复制的另一 span | 
异常
2) 不抛出。
3) 在 last - first 抛出时抛出其所抛出的异常。
7) 在 std::ranges::size(r) 与 std::ranges::data(r) 抛出时抛出其所抛出的异常。
参阅
|   返回指向元素序列起始的指针  (公开成员函数)  | |
|   返回序列中的元素数  (公开成员函数)  | |
  赋值 span (公开成员函数)  | |
|    (C++17)(C++20)  | 
   返回容器或数组的大小  (函数模板)  | 
|    (C++17)  | 
  获得指向底层数组的指针  (函数模板)  |