libstdc++: Handling user-defined interlike object in submdspan.

Luc Grosheintz luc.grosheintz@gmail.com
Mon Sep 29 13:39:04 GMT 2025



On 9/29/25 2:55 PM, Ville Voutilainen wrote:
> On Mon, 29 Sept 2025 at 15:27, Luc Grosheintz <luc.grosheintz@gmail.com> wrote:
>>
>> Dear libstdc++ devs,
>>
>> While implementing submdspan, I ran into difficulty related to
>> user-defined "integers", i.e. any class that converts to `index_type`
>> (the latter is always a signed or unsigned integer).
>>
>> The user-defined types might not be copyable or only convert to
>> `index_type` from an rvalue.
> 
> Perhaps they should be required to be copyable and convertible from lvalues, and
> if the spec doesn't allow such a requirement, the spec should be fixed.
> 
> I find it hard-fetched to have such wrinkles in types that are, for
> all purposes, supposed to emulate
> built-in types as far as possible, like custom number types are supposed to.

That sounds very tempting and would make things easier. I don't
fully know how the spec should be, but I can provide context.

However, if I look at the C++23 parts I seem to see parts that read
like they intentionally allow these wrinkles.

For example:

template<class... OtherIndexTypes>
   constexpr explicit extents(OtherIndexTypes... exts) noexcept;

   Let N be sizeof...(OtherIndexTypes), and let exts_arr be
   array<index_type, N>{static_cast<index_type>(std​::​move(exts))...}.

   Constraints:

     (6.1)  (is_convertible_v<OtherIndexTypes, index_type> && ...) is
     true,

https://eel.is/c++draft/views.multidim#mdspan.extents.cons-6.1

which can be contrasted with:

   template<class OtherIndexType, size_t N>
     constexpr explicit(N != rank_dynamic())
       extents(const array<OtherIndexType, N>& exts) noexcept;

   Constraints:

     (9.1) is_convertible_v<const OtherIndexType&, index_type> is true,

https://eel.is/c++draft/views.multidim#mdspan.extents.cons-9.1

In the past we've fixed "bugs" related to this issue:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121061

and raised an LWG issue to make the behaviour more uniform:
https://cplusplus.github.io/LWG/issue4314

which is how I got the impression these are wanted wrinkles.

Again I don't know which way it should change; but I like
uniformity. I also like simplicity, I just don't know if we're
allowed to change it now.


More information about the Libstdc++ mailing list