deduction guides for std::span
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Containers library
(C++17)
(C++11)
(C++26)
(C++26)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++23)
(C++23)
(C++23)
(C++23)
(C++20)
(C++23)
Tables
std::span
(C++26)
(C++23)
(C++23)
(C++23)
(C++23)
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) span( It, EndOrSize ) -> span<std::remove_reference_t <std::iter_reference_t <It>>>;
(until C++26)
template< class It, class EndOrSize >
(since C++26)
span( It, EndOrSize ) -> span<std::remove_reference_t <std::iter_reference_t <It>>,
template< class T, std::size_t N >
span( T (&)[N] ) -> span<T, N>;
(2)
(since C++20)
span( T (&)[N] ) -> span<T, N>;
template< class T, std::size_t N >
span( std::array <T, N>& ) -> span<T, N>;
(3)
(since C++20)
span( std::array <T, N>& ) -> span<T, N>;
template< class T, std::size_t N >
span( const std::array <T, N>& ) -> span<const T, N>;
(4)
(since C++20)
span( const std::array <T, N>& ) -> span<const T, N>;
template< class R >
span( R&& ) -> span<std::remove_reference_t <std::ranges::range_reference_t <R>>>;
(5)
(since C++20)
span( R&& ) -> span<std::remove_reference_t <std::ranges::range_reference_t <R>>>;
The following deduction guides are provided for span
.
1) Allows the element type to be deduced from the iterator-sentinel pair. It also allows the static extent to be deduced if
EndOrSize
satisfies integral-constant-like.(since C++26). This overload participates in overload resolution only if It
satisfies contiguous_iterator
.2-4) Allows the static extent to be deduced from built-in arrays and std::array .
5) Allows the element type to be deduced from ranges. This overload participates in overload resolution only if
R
satisfies contiguous_range
.[edit] Example
Run this code
#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"; else std::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 > 202302L std::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' const std::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