[committed] libstdc++: Use concepts and conditional explicit in std::optional

Jonathan Wakely jwakely@redhat.com
Thu Jul 25 18:23:29 GMT 2024


On Thu, 25 Jul 2024 at 19:22, François Dumont <frs.dumont@gmail.com> wrote:
>
>
> On 25/07/2024 12:55, Jonathan Wakely wrote:
> > Tested x86_64-linux. Pushed to trunk.
> >
> > -- >8 --
> >
> > For C++20 mode we can improve compile times by using conditional
> > explicit to reduce the number of constructor overloads. We can also use
> > requires-clauses instead of SFINAE to implement constraints on the
> > constructors and assignment operators.
> >
> > libstdc++-v3/ChangeLog:
> >
> >       * include/std/optional (optional): Use C++20 features to
> >       simplify overload sets for constructors and assignment
> >       operators.
> > ---
> >   libstdc++-v3/include/std/optional | 130 +++++++++++++++++++++++++++---
> >   1 file changed, 121 insertions(+), 9 deletions(-)
> >
> > diff --git a/libstdc++-v3/include/std/optional b/libstdc++-v3/include/std/optional
> > index 700e7047aba..2cc0221865e 100644
> > --- a/libstdc++-v3/include/std/optional
> > +++ b/libstdc++-v3/include/std/optional
> > @@ -768,6 +768,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >           is_assignable<_Tp&, const optional<_Up>&&>,
> >           is_assignable<_Tp&, optional<_Up>&&>>;
> >
> > +#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
> > +# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
> > +#endif
> > +
> >     /**
> >       * @brief Class template for optional values.
> >       */
> > @@ -794,17 +798,37 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> >         using _Base = _Optional_base<_Tp>;
> >
> >         // SFINAE helpers
> > -      template<typename _Up>
> > -     using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
> > -      template<typename _Up>
> > -     using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
> > -      template<typename... _Cond>
> > -     using _Requires = enable_if_t<__and_v<_Cond...>, bool>;
>
> Minor but above comment is an orphan now.

Everything below it is a SFINAE helper, in both branches of the #if



More information about the Libstdc++ mailing list