std::extents<IndexType,Extents...>::extents
From cppreference.com
                    
                                        
                    
                    
                                                            
                    |   constexpr extents() = default;  | 
(1) | (since C++23) | 
|   template< class OtherIndexType, std::size_t... OtherExtents > constexpr explicit(/*see below*/)  | 
(2) | (since C++23) | 
|   template< class... OtherIndexTypes > constexpr explicit extents( OtherIndexTypes... exts ) noexcept;  | 
(3) | (since C++23) | 
|   template< class OtherIndexType, std::size_t N > constexpr explicit(N != rank_dynamic())  | 
(4) | (since C++23) | 
|   template< class OtherIndexType, std::size_t N > constexpr explicit(N != rank_dynamic())  | 
(5) | (since C++23) | 
Construct an extents. One can construct extents from just dynamic extents, which are all the values getting stored, or from all the extents with a precondition.
1) Default constructor. Initializes all dynamic extents to zero.
2) Conversion from another 
extents object. After construction, *this == other is true.
- The behavior is undefined if
 
- other.extent(r) != static_extent(r) for any r for which static_extent(r) represents a static extent, or
 - other.extent(r) is not representable as a value of type IndexType for any rank value r in other.
 
- This overload participates in overload resolution only if
 
- sizeof...(OtherExtents) == rank() is true, and
 -  ((OtherExtents == std::dynamic_extent || Extents == std::dynamic_extent ||
OtherExtents == Extents) && ...) is true. 
- This constructor is explicit if
 
- ((Extents != std::dynamic_extent && OtherExtents == std::dynamic_extent) || ...) is true, or
 - std::numeric_limits<IndexType>::max() < std::numeric_limits<OtherIndexType>::max() is true.
 
3) Let N be sizeof...(exts) and exts_arr be std::array<IndexType, N>{static_cast<IndexType>(std::move(exts))...}, equivalent to extents(exts_arr).
- This overload participates in overload resolution only if
 
- (std::is_convertible_v<OtherIndexTypes, IndexType> && ...) is true,
 - (std::is_nothrow_constructible_v<IndexType, OtherIndexTypes> && ...) is true, and
 - N == rank_dynamic() || N == rank() is true.
 
- The behavior is undefined if
 
- N != rank_dynamic() and exts_arr[r] is not equal to static_extent(r) for any r for which static_extent(r) represents a static extent, or
 - an element in exts is negative or not representable as a value of type IndexType.
 
4,5) If N equals rank_dynamic(), for all d in 
[0, rank_dynamic()), direct-non-list-initializes dynamic-extents[d] with std::as_const(exts[d]). Otherwise, for all d in [0, rank_dynamic()), direct-non-list-initializes dynamic-extents[d] with std::as_const(exts[dynamic-index-inv(d)]).
- This overload participates in overload resolution only if
 
- std::is_convertible_v<const OtherIndexType&, IndexType> is true,
 - std::is_nothrow_constructible_v<IndexType, const OtherIndexType&> is true, and
 - N == rank_dynamic() || N == rank() is true.
 
- The behavior is undefined if
 
- N != rank_dynamic() and exts[r] is not equal to static_extent(r) for any r for which static_extent(r) represents a static extent, or
 - exts[r] is negative or not representable as a value of type IndexType for any rank index r.
 
Parameters
| other | - |  another extents to convert from
 | 
| exts | - | represents the extents | 
Example
| This section is incomplete Reason: no example  | 
See also
 
  | |||