[committed] libstdc++: Use concepts and conditional explicit in std::optional
François Dumont
frs.dumont@gmail.com
Thu Jul 25 18:21:39 GMT 2024
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.
More information about the Libstdc++
mailing list