1. Background
[P0009R18] added , a non-owning multidimensional span abstraction
to the C++ Standard Library.
It is excellent and flexible, allowing users to customize customize data
layout, access method, and index type.
However, this flexibility often comes with verbosity.
The length of each dimension (the extent) of an are represented by an object, and each extent may be expressed either statically or
dynamically:
// All static. mdspan < int , 64 , 64 , 64 > a ( d ); // All dynamic. mdspan < int , dynamic_extent , dynamic_extent , dynamic_extent > a ( d , 64 , 64 , 64 ); // Mixed static and dynamic. mdspan < int , 64 , dynamic_extent , 64 > a ( d , 64 );
[P2299R3] sought to make s easier to work with for one of the most
common cases - when all of your extents are dynamic.
It added deduction guides to make class template argument deduction (CTAD) work
for and .
mdspan a ( d , 64 , 64 ); // All dynamic.
However, CTAD does not help in all situations. If you are declaring a member of a class or a parameter to a function, you cannot use CTAD.
struct X { std :: mdspan < int , std :: dynamic_extent , std :: dynamic_extent , std :: dynamic_extent > a ; }; void f ( std :: mdspan < int , std :: dynamic_extent , std :: dynamic_extent , std :: dynamic_extent > a );
To simplify these cases, [P2299R3] also added , a template alias
for an with dynamic extents.
template < std :: size_t N > using dextents = /* ... */ ; struct X { std :: mdspan < int , std :: dextents < 3 >> a ; }; void f ( mdspan < int , std :: dextents < 3 >> a );
2. Problem
Originally, and used a fixed index type ().
However, the signedness and size of the index type can have an impact on
performance in certain cases.
So, [P2553R1] parameterized the index type used by and .
As a part of this change, an index type template parameter was added to :
template < typename IndexType , std :: size_t Rank > using dextents = /* ... */
This change has made using more verbose, which is unfortunate, as
the main purpose of is to make common usages as simple
as possible:
struct X { std :: mdspan < int , std :: dextents < std :: size_t , 3 >> a ; }; void f ( mdspan < int , std :: dextents < std :: size_t , 3 >> a );
Index type customization is an important feature for to support, but it
is not something that most users will need to use or think about.
If they do need it, they can always use the more verbose .
3. Proposed Changes
Remove the index type parameter from and have it default to .
MSVC’s STL and LLVM’s libc++ are already shipping .
GCC’s libstdc++ is not shipping yet.
So, modifying would be a source-breaking change but would have no
ABI impact as is a template alias.
Alternatively and more practically, we could leave alone, but add a
new template alias that does not have an index type parameter.