Namespaces
Variants

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

From cppreference.net
constexpr span ( ) noexcept ;
(1) (自 C++20 起)
template < class It >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( It first, size_type count ) ;
(2) (自 C++20 起)
template < class It, class End >

explicit ( extent ! = std:: dynamic_extent )

constexpr span ( It first, End last ) ;
(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 )

constexpr span ( R && r ) ;
(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 )

constexpr span ( const std:: span < U, N > & source ) noexcept ;
(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 时参与重载决议:

1) extent == std:: dynamic_extent || extent == 0
4-6) extent == std:: dynamic_extent || extent == N
9) extent == std:: dynamic_extent || N == std:: dynamic_extent || extent == N


若下列表达式结果为 false ,则行为未定义。

(C++26 前)

若下列表达式结果为 false

  • 若实现为 强化实现 ,则发生 契约违反 。此外,若契约违反处理程序在“观察”求值语义下返回,则行为未定义。
  • 若实现非强化实现,则行为未定义。
(C++26 起)
2) extent == std:: dynamic_extent || extent == count
3) extent == std:: dynamic_extent || extent == last - first
7) extent == std:: dynamic_extent || extent == ranges:: size ( r )
8) extent == std:: dynamic_extent || extent == il. size ( )
9) extent == std:: dynamic_extent || extent == source. size ( )

转换要求

如果 element_type 与源范围的元素类型不同,且后者无法通过 限定转换 转换为前者,则无法构造 span 对象。

这些重载仅当 std:: is_convertible_v < U ( * ) [ ] , element_type ( * ) [ ] > true 时参与重载决议,其中 U 定义如下:

4-6) std:: remove_pointer_t < decltype ( std:: data ( arr ) ) >
9) 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 时需要

其他约束

2) 如果 [ first , first + count ) 不是有效的 范围 ,则行为未定义。
3) 此重载仅在 std:: is_convertible_v < End, std:: size_t > false 时参与重载决议。
如果 [ first , last ) 不是有效范围,则行为未定义。
7) 此重载仅在满足以下所有条件时参与重载决议:
8) 此重载仅当 std:: is_const_v < element_type > true 时参与重载决议。

异常

2) 不抛出任何异常。
3) 抛出内容及时间 last - first 抛出时。
7) 说明 std :: ranges:: size ( r ) std :: ranges:: data ( r ) 在何时抛出何种异常。

注释

功能测试 标准 功能
__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)
获取底层数组的指针
(函数模板)