std::span(C++17) | ||||
| Sequence | ||||
(C++11) | ||||
(C++26) | ||||
(C++26) | ||||
(C++11) | ||||
| Associative | ||||
| Unordered associative | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
| Adaptors | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
| Views | ||||
(C++20) | ||||
(C++23) | ||||
| Tables | ||||
| Iterator invalidation | ||||
| Member function table | ||||
| Non-member function table |
| Member functions | ||||
| Element access | ||||
(C++26) | ||||
| Iterators | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
| Observers | ||||
| Subviews | ||||
| Non-member functions | ||||
| Non-member constant | ||||
| Deduction guides |
Defined in header <span> | ||
| (1) | ||
template<class It,class EndOrSize> span( It, EndOrSize)-> span<std::remove_reference_t<std::iter_reference_t<It>>>; | (since C++20) (until C++26) | |
template<class It,class EndOrSize> span( It, EndOrSize)-> span<std::remove_reference_t<std::iter_reference_t<It>>, | (since C++26) | |
template<class T,std::size_t N> span( T(&)[N])-> span<T, N>; | (2) | (since C++20) |
template<class T,std::size_t N> span(std::array<T, N>&)-> span<T, N>; | (3) | (since C++20) |
template<class T,std::size_t N> span(conststd::array<T, N>&)-> span<const T, N>; | (4) | (since C++20) |
template<class R> span( R&&)-> span<std::remove_reference_t<std::ranges::range_reference_t<R>>>; | (5) | (since C++20) |
The followingdeduction guides are provided forspan.
EndOrSize satisfiesintegral-constant-like.(since C++26). This overload participates in overload resolution only ifIt satisfiescontiguous_iterator.R satisfiescontiguous_range.#include <array>#include <cstddef>#include <iomanip>#include <iostream>#include <span>#include <string_view>#include <vector> void print(std::string_view rem="",std::size_t size_of=0,std::size_t extent=0){if(rem.empty()){std::cout<<"name │ sizeof │ extent\n""─────┼────────┼────────\n";return;}std::cout<<std::setw(4)<< rem<<" │ "<<std::setw(6)<< size_of<<" │ ";if(extent==std::dynamic_extent)std::cout<<"dynamic";elsestd::cout<< extent;std::cout<<'\n';} int main(){int a[]{1,2,3,4,5}; print();std::span s1{std::begin(a),std::end(a)};// guide (1) print("s1", sizeof s1, s1.extent); std::span s2{std::begin(a),3};// guide (1) print("s2", sizeof s2, s2.extent); #if __cplusplus > 202302Lstd::span s3{std::begin(a),std::integral_constant<std::size_t,2>{}};// guide (1) print("s3", sizeof s3, s3.extent);#endif // C++26 std::span s4{a};// guide (2) print("s4", sizeof s4, s4.extent); std::span<int> s5{a};// does not use a guide, makes a dynamic span print("s5", sizeof s5, s5.extent); std::array arr{6,7,8};std::span s6{arr};// guide (3) print("s6", sizeof s6, s6.extent); s6[0]=42;// OK, element_type is 'int' conststd::array arr2{9,10,11};std::span s7{arr2};// guide (4) print("s7", sizeof s7, s7.extent);// s7[0] = 42; // Error: element_type is 'const int' std::vector v{66,69,99};std::span s8{v};// guide (5) print("s8", sizeof s8, s8.extent);}
Possible output:
name │ sizeof │ extent─────┼────────┼──────── s1 │ 16 │ dynamic s2 │ 16 │ dynamic s3 │ 8 │ 2 s4 │ 8 │ 5 s5 │ 16 │ dynamic s6 │ 8 │ 3 s7 │ 8 │ 3 s8 │ 16 │ dynamic