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&& r );
(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() == nullptrsize() == 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 不实际实现 Itsized_sentinel_for ,或若 extent != std::dynamic_extent && last-first != extent 则行为未定义。
  • 此重载仅若
才参与重载决议。
4-6) 构造作为数组 arr 上的视图的 span ;产生的 span 有 size() == Ndata() == std::data(arr)
  • 这些重载仅若extent == std::dynamic_extent || N == extenttrue 且从 std::remove_pointer_t<decltype(std::data(arr))>element_type 的转换至多为限定转换才参与重载决议。这些构造函数模板决不用于类模板实参推导。
7) 构造作为范围 r 上的视图的 span ;产生的 span 有 size() == std::ranges::size(r)data() == std::ranges::data(r)
  • R 不实际实现 contiguous_rangesized_range 或当 element_type 为非 const 时 R 不实际实现 borrowed_rangeextent != dynamic_extentstd::ranges::size(r) != extent 均为 true 则行为未定义。
  • 此重载仅若
  • extent == dynamic_extent
  • R 满足 contiguous_rangesized_range
  • R 满足 borrowed_rangestd::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 s 的转换构造函数;产生的 span 有 size() == s.size()data() == s.data()
  • extent != dynamic_extents.size() != extent 均为 true 则行为未定义。
  • 此重载仅若extent == std::dynamic_extentN == std::dynamic_extentN == extent 至少一者为 true 且从 Uelement_type 的转换至多为限定转换才参与重载决议。
9) 默认化的赋值构造函数复制大小与数据指针;产生的 span 有 size() == other.size()data() == other.data()

参数

first - 指向序列首元素的迭代器
count - 序列的元素数
last - 指向序列末元素后一位置的迭代器或另一哨位
arr - 用于构造视图的数组
r - 用于构造视图的范围
s - 要转换的另一 span
other - 要复制的另一 span

异常

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

参阅

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