C++ 参考手册

位置:首页 > C++ 参考手册 >容器库 >std::span > std::span<T,Extent>::span

constexpr span() noexcept;
(1)
template <class It>
constexpr span(It first, size_type count);
(2)
template <class It, class End>
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>
constexpr span(R&& r);
(7)
template <class U, std::size_t N>
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 == extenttruestd::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_range 则行为未定义。 这些重载仅若

  • 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 == std::dynamic_extent || N == extenttrueU (*)[] 可转换为 element_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)
获得指向底层数组的指针
(函数模板)