On Sat, Oct 18, 2025 at 11:04:38PM +0800, Hewill Kang wrote:
> These appear to be noexcept-able.

Exactly, thanks, I just sent v3.
Best regards,
Osama

> 
> Osama Abdelkader <[email protected]> 於 2025年10月18日 週六 下午10:50寫道:
> 
> > This fixes the C++23 compliance issue where std::tuple<> cannot be compared
> > with other empty tuple-like types such as std::array<T, 0>.
> >
> > The operators correctly allow comparison with array<T, 0> even when T is
> > not
> > comparable, because empty tuple-like types don't compare element values.
> >
> > libstdc++-v3/ChangeLog:
> >
> >         PR libstdc++/119721
> >         * include/std/tuple: Add tuple<> comparison operators for
> >         empty tuple-like types.
> >
> > Signed-off-by: Osama Abdelkader <[email protected]>
> > ---
> > v2:
> > - Replaced explicit array<T, 0> operators with generic tuple-like operators
> > - Only operator== and operator<=> are provided
> > - Operators work with any empty tuple-like type
> > - No need for reversed argument order
> > ---
> >  libstdc++-v3/include/std/tuple | 19 +++++++++++++++++++
> >  1 file changed, 19 insertions(+)
> >
> > diff --git a/libstdc++-v3/include/std/tuple
> > b/libstdc++-v3/include/std/tuple
> > index 0ca616f1b..800f6e372 100644
> > --- a/libstdc++-v3/include/std/tuple
> > +++ b/libstdc++-v3/include/std/tuple
> > @@ -2001,6 +2001,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >         tuple(allocator_arg_t, const _Alloc&, const tuple&) noexcept { }
> >      };
> >
> > +#if __cpp_lib_tuple_like // >= C++23
> > +  // Comparison operators for tuple<> with other empty tuple-like types
> > +  // Note: These operators allow comparison with any empty tuple-like
> > type,
> > +  // including array<T, 0> and span<T, 0>, where T may not be comparable.
> > +  // This is correct because empty tuple-like types don't compare
> > elements.
> > +  template<__tuple_like _UTuple>
> > +    requires (!__is_tuple_v<_UTuple> && tuple_size_v<_UTuple> == 0)
> > +  [[nodiscard]]
> > +  constexpr bool
> > +  operator==(const tuple<>&, const _UTuple&)
> > +  { return true; }
> > +
> > +  template<__tuple_like _UTuple>
> > +    requires (!__is_tuple_v<_UTuple> && tuple_size_v<_UTuple> == 0)
> > +  constexpr strong_ordering
> > +  operator<=>(const tuple<>&, const _UTuple&)
> > +  { return strong_ordering::equal; }
> > +#endif // C++23
> > +
> >  #if !(__cpp_concepts && __cpp_consteval && __cpp_conditional_explicit) //
> > !C++20
> >    /// Partial specialization, 2-element tuple.
> >    /// Includes construction and assignment from a pair.
> > --
> > 2.43.0
> >
> >

Reply via email to