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

< cpp‎ | container‎ | span

constexpr span() noexcept; | (1) |
template< class It > explicit(extent != std::dynamic_extent) constexpr span( It first, size_type count ); | (2) |
template< class It, class End > explicit(extent != std::dynamic_extent) constexpr span( It first, End last ); | (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) constexpr span( R&& range ); | (7) |
template< class U, std::size_t N > explicit(extent != std::dynamic_extent && N == std::dynamic_extent) constexpr span( const std::span<U, N>& s ) noexcept; | (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 | - | 用于构造视图的数组
r | - | 用于构造视图的范围
source | - | 要转换的另一 span
other | - | 要复制的另一 span

### 异常

2) 不抛出。
3) 在抛出时 last - first 抛出其所抛出的异常。
7) 在 std::ranges::size(r) 与 std::ranges::data(r) 抛出时抛出其所抛出的异常。

### 参阅

data | 返回指向元素序列起始的指针 (公开成员函数)
size | 返回序列中的元素数 (公开成员函数)
operator= | 赋值 `span` (公开成员函数)
size ssize (C++17)(C++20) | 返回容器或数组的大小 (函数模板)
data (C++17) | 获得指向底层数组的指针 (函数模板)