On Thu, 13 Mar 2025 at 23:03, Patrick Palka <ppa...@redhat.com> wrote: > + // Defined as a template to work around PR libstdc++/116440. > + template<class...> > + constexpr explicit(!__convertible<const _Elements&...>()) > + tuple(const _Elements&... __elements)
I don't understand how a constructor template declared like this can ever be called. The template parameter pack can't be provided or deduced, and can't have a default. So we're effectively making this signature always lose overload resolution to the one that takes a pack of _UElements&&. Which may be fine. I can't head-compile a test that would fail in that case. If any of the incoming argument isn't one of _Elements, that constructor wins overload resolution anyway. If the incoming arguments are exactly _Elements, that constructor does the same thing as this one. I think.