std::span<T,Extent>:: span
|
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
。
目录 |
参数
| first | - | 指向序列首元素的迭代器 |
| count | - | 序列中的元素数量 |
| last | - | 指向序列末元素后位置的迭代器或其他哨位 |
| arr | - | 要为其构造视图的数组 |
| r | - | 要为其构造视图的范围 |
| source | - |
要转换的另一个
span
|
| other | - |
要复制的另一个
span
|
效果
| 重载版本 |
构造后的
data()
|
构造后的
size()
|
|---|---|---|
| ( 1 ) | nullptr | 0 |
| ( 2 ) | std:: to_address ( first ) | count |
| ( 3 ) | last - first | |
| ( 4 ) | std:: data ( arr ) | N |
| ( 5 ) | ||
| ( 6 ) | ||
| ( 7 ) | ranges:: data ( r ) | ranges:: size ( r ) |
| ( 8 ) | il. begin ( ) | il. size ( ) |
| ( 9 ) | source. data ( ) | source. size ( ) |
| ( 10 ) | other. data ( ) | other. size ( ) |
约束条件与补充信息
大小要求
如果
extent
不是
std::
dynamic_extent
且源范围的大小与
extent
不同,则无法构造
span
对象。
这些重载仅在以下表达式结果为 true 时参与重载决议:
|
若下列表达式结果为 false ,则行为未定义。 |
(C++26 前) |
|
若下列表达式结果为 false : |
(C++26 起) |
转换要求
如果
element_type
与源范围的元素类型不同,且后者无法通过
限定转换
转换为前者,则无法构造
span
对象。
这些重载仅当
std::
is_convertible_v
<
U
(
*
)
[
]
, element_type
(
*
)
[
]
>
为
true
时参与重载决议,其中
U
定义如下:
U
概念要求
如果任何模板参数不满足特定概念要求,则无法构造
span
对象。
这些重载仅在对应模板参数的模板实参满足相应概念时参与重载决议。若其不满足任何对应概念的语义要求,则行为未定义:
| 重载版本 |
模板
参数 |
概念 | 备注 |
|---|---|---|---|
| ( 2 ) |
It
|
contiguous_iterator
|
|
| ( 3 ) |
It
|
contiguous_iterator
|
|
End
|
sized_sentinel_for<It>
|
||
| ( 7 ) |
R
|
contiguous_range
|
|
sized_range
|
|||
borrowed_range
|
仅当 std:: is_const_v < element_type > 为 false 时需要 |
其他约束
[
first
,
last
)
不是有效范围,则行为未定义。
-
std::
remove_cvref_t
<
R
>
不是
std::span或 std::array 的特化。 - std:: is_array_v < std:: remove_cvref_t < R >> 为 false 。
异常
注释
| 功能测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__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)
|
获取底层数组的指针
(函数模板) |