Skip to content

Commit 2c0e044

Browse files
authored
Merge 2024-03 LWG Motion 18
[LWG motion 18] P3029R1 Better mdspan's CTAD
2 parents 063acd3 + 608090e commit 2c0e044

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

source/containers.tex

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18228,6 +18228,20 @@
1822818228
// constants
1822918229
inline constexpr size_t @\libglobal{dynamic_extent}@ = numeric_limits<size_t>::max();
1823018230

18231+
template<class T>
18232+
concept @\defexposconcept{integral-constant-like}@ = // \expos
18233+
is_integral_v<decltype(T::value)> &&
18234+
!is_same_v<bool, remove_const_t<decltype(T::value)>> &&
18235+
@\libconcept{convertible_to}@<T, decltype(T::value)> &&
18236+
@\libconcept{equality_comparable_with}@<T, decltype(T::value)> &&
18237+
bool_constant<T() == T::value>::value &&
18238+
bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;
18239+
18240+
template<class T>
18241+
constexpr size_t @\defexposconcept{maybe-static-ext}@ = dynamic_extent; // \expos
18242+
template<@\exposconcept{integral-constant-like}@ T>
18243+
constexpr size_t @\exposconcept{maybe-static-ext}@<T> = {T::value};
18244+
1823118245
// \ref{views.span}, class template \tcode{span}
1823218246
template<class ElementType, size_t Extent = dynamic_extent>
1823318247
class span; // partially freestanding
@@ -18343,7 +18357,8 @@
1834318357
};
1834418358

1834518359
template<class It, class EndOrSize>
18346-
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>>;
18360+
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>,
18361+
@\exposconcept{maybe-static-ext}@<EndOrSize>>;
1834718362
template<class T, size_t N>
1834818363
span(T (&)[N]) -> span<T, N>;
1834918364
template<class T, size_t N>
@@ -18635,7 +18650,8 @@
1863518650
\indexlibrary{\idxcode{span}!deduction guide}%
1863618651
\begin{itemdecl}
1863718652
template<class It, class EndOrSize>
18638-
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>>;
18653+
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>,
18654+
@\exposconcept{maybe-static-ext}@<EndOrSize>>;
1863918655
\end{itemdecl}
1864018656

1864118657
\begin{itemdescr}
@@ -19098,15 +19114,6 @@
1909819114
const mdspan<ElementType, Extents, LayoutPolicy, AccessorPolicy>& src,
1909919115
SliceSpecifiers... slices) -> @\seebelow@;
1910019116

19101-
template<class T>
19102-
concept @\defexposconcept{integral-constant-like}@ = // \expos
19103-
is_integral_v<decltype(T::value)> &&
19104-
!is_same_v<bool, remove_const_t<decltype(T::value)>> &&
19105-
@\libconcept{convertible_to}@<T, decltype(T::value)> &&
19106-
@\libconcept{equality_comparable_with}@<T, decltype(T::value)> &&
19107-
bool_constant<T() == T::value>::value &&
19108-
bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;
19109-
1911019117
template<class T, class IndexType>
1911119118
concept @\defexposconcept{index-pair-like}@ = // \expos
1911219119
@\exposconcept{pair-like}@<T> &&
@@ -19458,7 +19465,7 @@
1945819465

1945919466
\pnum
1946019467
\remarks
19461-
The deduced type is \tcode{dextents<size_t, sizeof...(Integrals)>}.
19468+
The deduced type is \tcode{extents<size_t, \exposconcept{maybe-static-ext}<Integrals>...>}.
1946219469
\end{itemdescr}
1946319470

1946419471
\rSec4[mdspan.extents.obs]{Observers of the multidimensional index space}
@@ -22549,7 +22556,7 @@
2254922556
template<class ElementType, class... Integrals>
2255022557
requires ((is_convertible_v<Integrals, size_t> && ...) && sizeof...(Integrals) > 0)
2255122558
explicit mdspan(ElementType*, Integrals...)
22552-
-> mdspan<ElementType, dextents<size_t, sizeof...(Integrals)>>;
22559+
-> mdspan<ElementType, extents<size_t, @\exposconcept{maybe-static-ext}@<Integrals>...>>;
2255322560

2255422561
template<class ElementType, class OtherIndexType, size_t N>
2255522562
mdspan(ElementType*, span<OtherIndexType, N>)

0 commit comments

Comments
 (0)