Namespaces
Variants
Actions

deduction guides for std::span

From cppreference.com
< cpp‎ | container‎ | span
 
 
 
 
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>>,

                              /*maybe-static-ext*/<EndOrSize>>;
(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( const std::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 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
Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/container/span/deduction_guides&oldid=171290"

AltStyle によって変換されたページ (->オリジナル) /