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

François Dumont frs.dumont@gmail.com
Thu Jul 25 18:54:44 GMT 2024


On 25/07/2024 20:24, Jonathan Wakely wrote:
> On Thu, 25 Jul 2024 at 19:23, Jonathan Wakely <jwakely@redhat.com> wrote:
>> 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
> But if that's not clear, maybe the comment does more harm than good
> and should be removed.
>
I try to avoid blank line after a comment but it's clear for me now so 
as you wish.


More information about the Libstdc++ mailing list