std::span<T,Extent>::span
来自cppreference.com
constexpr span() noexcept; |
(1) | (C++20 起) |
template< class It > explicit(extent != std::dynamic_extent) |
(2) | (C++20 起) |
template< class It, class End > explicit(extent != std::dynamic_extent) |
(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) |
(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) |
(9) | (C++20 起) |
constexpr span( const span& other ) noexcept = default; |
(10) | (C++20 起) |
构造 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,则行为未定义。 - 此重载只有在
-
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) 构造作为初始化式列表
il
上的视图的 span;产生的 span 有 size() == il.size() 且 data() == il.begin()。
- 若 extent != dynamic_extent 与 il.size() != extent 均为 true,则行为未定义。
- 仅当 std::is_const_v<element_type> 为 true 时,此重载参与重载决议。
9) 从另一 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 的转换至多为限定转换时才会参与重载决议。
10) 预置的赋值构造函数复制大小与数据指针;产生的 span 有 size() == other.size() 且 data() == other.data()。
参数
first | - | 指向序列首元素的迭代器 |
count | - | 序列的元素数 |
last | - | 指向序列末元素后一位置的迭代器或另一哨位 |
arr | - | 用于构造视图的数组 |
range | - | 用于构造视图的范围 |
source | - | 要转换的另一 span |
other | - | 要复制的另一 span |
异常
2) 不抛出。
3) 在 last - first 抛出时抛出其所抛出的异常。
注解
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_span_initializer_list |
202311L | (C++26) | 以一个 std::initializer_list 构造std::span ,(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
参阅
直接访问底层连续存储 (公开成员函数) | |
返回元素数 (公开成员函数) | |
赋值 span (公开成员函数) | |
(C++17)(C++20) |
返回容器或数组的大小 (函数模板) |
(C++17) |
获得指向底层数组的指针 (函数模板) |