From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id EA5893858D32 for ; Thu, 25 May 2023 18:30:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EA5893858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1685039452; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=o/g52XCVLccxyTXAhATn1q2s09pCQ4LnbhS2byz/l+g=; b=KzSBsZzRTS+ncos4dJGprT0cuWBcZFwGvefDwHSBZJu0o0ZLwViSRiWuDGhqbGbEpn5yQ1 On8nufqQmd0tOApPeH/3tZ1wTVacoX48/PyvdqkGWq/OlWM2RT1aCwkCpM/AgQ7IxxhjbM loAH5Y4196S3bmGBsQqis7evtl/eBFI= Received: from mail-lj1-f198.google.com (mail-lj1-f198.google.com [209.85.208.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-375-Xi3hClBKO5GQzjeRgwF60g-1; Thu, 25 May 2023 14:30:51 -0400 X-MC-Unique: Xi3hClBKO5GQzjeRgwF60g-1 Received: by mail-lj1-f198.google.com with SMTP id 38308e7fff4ca-2af2cff22ecso4117261fa.3 for ; Thu, 25 May 2023 11:30:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685039449; x=1687631449; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o/g52XCVLccxyTXAhATn1q2s09pCQ4LnbhS2byz/l+g=; b=Bn/gNXfp492sieoc2SizcK67hnTV5YQ/FZLs/lbnBGOrrnaLx/iddPbgA5CK+yuUY4 rxCz/mA95bThi1nJONuaLwivR2TXbGeLJ8bZEtsD3+N5oICcC+gk2xBB2r2N4/TBDN0N r5S4LIvN+1U2gX1Y1We5PuTTu58cXAuQ1JkqB9D8h1yd2shKpRzWShvWSHCiLa06aYE0 6TfhTNL6n6Lj7JlRrg+TzKQrCrSvvn+C6XiHnWd2yfkjytIXxBEMrE1mWuj6frU1c8HV +gt6W8cIkUOntd1uJpl+M2LGGw9nSxokgRx5nJvKH6KWKiSexbCy8+2CbCh4oz5fgUa4 A3Hg== X-Gm-Message-State: AC+VfDy6YEcvKxUQD554sPZmvYnTCYRBc5lrASP5hOE6u3BIAAzyxjOs 7pdZhQS/FhMxqVaNjK7jachUomgGll/M21JQ8VlT4ePFgsaEQ1KBHVsN3sCwd3M/q0ndajmKFRH eWbJWXgtOXcDHGSVgAHGP0S48xWOyr6y8Dg== X-Received: by 2002:a2e:9b0a:0:b0:2ae:db65:2d01 with SMTP id u10-20020a2e9b0a000000b002aedb652d01mr1309151lji.23.1685039449329; Thu, 25 May 2023 11:30:49 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6mZ86OpWKgy8ik/h/OjoHOgxorILNtre+bbjgPdQP3MQXUXrxZ+18WdOwRvJ+dDLcb+kBVV0qdQ6dZWPuNiL0= X-Received: by 2002:a2e:9b0a:0:b0:2ae:db65:2d01 with SMTP id u10-20020a2e9b0a000000b002aedb652d01mr1309139lji.23.1685039448714; Thu, 25 May 2023 11:30:48 -0700 (PDT) MIME-Version: 1.0 References: <20230523194114.56310-1-kmatsui@cs.washington.edu> In-Reply-To: <20230523194114.56310-1-kmatsui@cs.washington.edu> From: Patrick Palka Date: Thu, 25 May 2023 14:30:37 -0400 Message-ID: Subject: Re: [PATCH] libstdc++: use using instead of typedef for type_traits To: Ken Matsui Cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Tue, May 23, 2023 at 3:42=E2=80=AFPM Ken Matsui via Gcc-patches wrote: > > Since the type_traits header is a C++11 header file, using can be used in= stead > of typedef. This patch provides more readability, especially for long typ= e > names. > > libstdc++-v3/ChangeLog: > > * include/std/type_traits: Use using instead of typedef LGTM, thanks! > --- > libstdc++-v3/include/std/type_traits | 158 +++++++++++++-------------- > 1 file changed, 79 insertions(+), 79 deletions(-) > > diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/= std/type_traits > index bc6982f9e64..0e7a9c9c7f3 100644 > --- a/libstdc++-v3/include/std/type_traits > +++ b/libstdc++-v3/include/std/type_traits > @@ -61,9 +61,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > struct integral_constant > { > - static constexpr _Tp value =3D __v; > - typedef _Tp value_type; > - typedef integral_constant<_Tp, __v> type; > + static constexpr _Tp value =3D __v; > + using value_type =3D _Tp; > + using type =3D integral_constant<_Tp, __v>; > constexpr operator value_type() const noexcept { return value; } > #if __cplusplus > 201103L > > @@ -109,7 +109,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > // Partial specialization for true. > template > struct enable_if > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > // __enable_if_t (std::enable_if_t for C++11) > template > @@ -946,7 +946,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_destructible_impl > : public __do_is_destructible_impl > { > - typedef decltype(__test<_Tp>(0)) type; > + using type =3D decltype(__test<_Tp>(0)); > }; > > template @@ -1000,7 +1000,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_nt_destructible_impl > : public __do_is_nt_destructible_impl > { > - typedef decltype(__test<_Tp>(0)) type; > + using type =3D decltype(__test<_Tp>(0)); > }; > > template @@ -1252,7 +1252,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_implicitly_default_constructible_impl > : public __do_is_implicitly_default_constructible_impl > { > - typedef decltype(__test(declval<_Tp>())) type; > + using type =3D decltype(__test(declval<_Tp>())); > }; > > template > @@ -1422,7 +1422,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > is_array<_To>>::value> > struct __is_convertible_helper > { > - typedef typename is_void<_To>::type type; > + using type =3D typename is_void<_To>::type; > }; > > #pragma GCC diagnostic push > @@ -1443,7 +1443,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > __test(...); > > public: > - typedef decltype(__test<_From, _To>(0)) type; > + using type =3D decltype(__test<_From, _To>(0)); > }; > #pragma GCC diagnostic pop > > @@ -1521,20 +1521,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// remove_const > template > struct remove_const > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct remove_const<_Tp const> > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > /// remove_volatile > template > struct remove_volatile > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct remove_volatile<_Tp volatile> > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > /// remove_cv > #if __has_builtin(__remove_cv) > @@ -1658,83 +1658,83 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > template > struct __cv_selector<_Unqualified, false, false> > - { typedef _Unqualified __type; }; > + { using __type =3D _Unqualified; }; > > template > struct __cv_selector<_Unqualified, false, true> > - { typedef volatile _Unqualified __type; }; > + { using __type =3D volatile _Unqualified; }; > > template > struct __cv_selector<_Unqualified, true, false> > - { typedef const _Unqualified __type; }; > + { using __type =3D const _Unqualified; }; > > template > struct __cv_selector<_Unqualified, true, true> > - { typedef const volatile _Unqualified __type; }; > + { using __type =3D const volatile _Unqualified; }; > > template bool _IsConst =3D is_const<_Qualified>::value, > bool _IsVol =3D is_volatile<_Qualified>::value> > class __match_cv_qualifiers > { > - typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match; > + using __match =3D __cv_selector<_Unqualified, _IsConst, _IsVol>; > > public: > - typedef typename __match::__type __type; > + using __type =3D typename __match::__type; > }; > > // Utility for finding the unsigned versions of signed integral types. > template > struct __make_unsigned > - { typedef _Tp __type; }; > + { using __type =3D _Tp; }; > > template<> > struct __make_unsigned > - { typedef unsigned char __type; }; > + { using __type =3D unsigned char; }; > > template<> > struct __make_unsigned > - { typedef unsigned char __type; }; > + { using __type =3D unsigned char; }; > > template<> > struct __make_unsigned > - { typedef unsigned short __type; }; > + { using __type =3D unsigned short; }; > > template<> > struct __make_unsigned > - { typedef unsigned int __type; }; > + { using __type =3D unsigned int; }; > > template<> > struct __make_unsigned > - { typedef unsigned long __type; }; > + { using __type =3D unsigned long; }; > > template<> > struct __make_unsigned > - { typedef unsigned long long __type; }; > + { using __type =3D unsigned long long; }; > > #if defined(__GLIBCXX_TYPE_INT_N_0) > __extension__ > template<> > struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0> > - { typedef unsigned __GLIBCXX_TYPE_INT_N_0 __type; }; > + { using __type =3D unsigned __GLIBCXX_TYPE_INT_N_0; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_1) > __extension__ > template<> > struct __make_unsigned<__GLIBCXX_TYPE_INT_N_1> > - { typedef unsigned __GLIBCXX_TYPE_INT_N_1 __type; }; > + { using __type =3D unsigned __GLIBCXX_TYPE_INT_N_1; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_2) > __extension__ > template<> > struct __make_unsigned<__GLIBCXX_TYPE_INT_N_2> > - { typedef unsigned __GLIBCXX_TYPE_INT_N_2 __type; }; > + { using __type =3D unsigned __GLIBCXX_TYPE_INT_N_2; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_3) > __extension__ > template<> > struct __make_unsigned<__GLIBCXX_TYPE_INT_N_3> > - { typedef unsigned __GLIBCXX_TYPE_INT_N_3 __type; }; > + { using __type =3D unsigned __GLIBCXX_TYPE_INT_N_3; }; > #endif > > // Select between integral and enum: not possible to be both. > @@ -1833,7 +1833,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// make_unsigned > template > struct make_unsigned > - { typedef typename __make_unsigned_selector<_Tp>::__type type; }; > + { using type =3D typename __make_unsigned_selector<_Tp>::__type; }; > > // Integral, but don't define. > template<> struct make_unsigned; > @@ -1846,55 +1846,55 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > // Utility for finding the signed versions of unsigned integral types. > template > struct __make_signed > - { typedef _Tp __type; }; > + { using __type =3D _Tp; }; > > template<> > struct __make_signed > - { typedef signed char __type; }; > + { using __type =3D signed char; }; > > template<> > struct __make_signed > - { typedef signed char __type; }; > + { using __type =3D signed char; }; > > template<> > struct __make_signed > - { typedef signed short __type; }; > + { using __type =3D signed short; }; > > template<> > struct __make_signed > - { typedef signed int __type; }; > + { using __type =3D signed int; }; > > template<> > struct __make_signed > - { typedef signed long __type; }; > + { using __type =3D signed long; }; > > template<> > struct __make_signed > - { typedef signed long long __type; }; > + { using __type =3D signed long long; }; > > #if defined(__GLIBCXX_TYPE_INT_N_0) > __extension__ > template<> > struct __make_signed > - { typedef __GLIBCXX_TYPE_INT_N_0 __type; }; > + { using __type =3D __GLIBCXX_TYPE_INT_N_0; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_1) > __extension__ > template<> > struct __make_signed > - { typedef __GLIBCXX_TYPE_INT_N_1 __type; }; > + { using __type =3D __GLIBCXX_TYPE_INT_N_1; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_2) > __extension__ > template<> > struct __make_signed > - { typedef __GLIBCXX_TYPE_INT_N_2 __type; }; > + { using __type =3D __GLIBCXX_TYPE_INT_N_2; }; > #endif > #if defined(__GLIBCXX_TYPE_INT_N_3) > __extension__ > template<> > struct __make_signed > - { typedef __GLIBCXX_TYPE_INT_N_3 __type; }; > + { using __type =3D __GLIBCXX_TYPE_INT_N_3; }; > #endif > > // Select between integral and enum: not possible to be both. > @@ -1918,10 +1918,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > class __make_signed_selector<_Tp, false, true> > { > - typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_= type; > + using __unsigned_type =3D typename __make_unsigned_selector<_Tp>::= __type; > > public: > - typedef typename __make_signed_selector<__unsigned_type>::__type _= _type; > + using __type =3D typename __make_signed_selector<__unsigned_type>:= :__type; > }; > > // wchar_t, char16_t and char32_t are integral types but are neither > @@ -1965,7 +1965,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// make_signed > template > struct make_signed > - { typedef typename __make_signed_selector<_Tp>::__type type; }; > + { using type =3D typename __make_signed_selector<_Tp>::__type; }; > > // Integral, but don't define. > template<> struct make_signed; > @@ -1988,28 +1988,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// remove_extent > template > struct remove_extent > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct remove_extent<_Tp[_Size]> > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct remove_extent<_Tp[]> > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > /// remove_all_extents > template > struct remove_all_extents > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct remove_all_extents<_Tp[_Size]> > - { typedef typename remove_all_extents<_Tp>::type type; }; > + { using type =3D typename remove_all_extents<_Tp>::type; }; > > template > struct remove_all_extents<_Tp[]> > - { typedef typename remove_all_extents<_Tp>::type type; }; > + { using type =3D typename remove_all_extents<_Tp>::type; }; > > #if __cplusplus > 201103L > /// Alias template for remove_extent > @@ -2025,11 +2025,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > template > struct __remove_pointer_helper > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > template > struct __remove_pointer_helper<_Tp, _Up*> > - { typedef _Up type; }; > + { using type =3D _Up; }; > > /// remove_pointer > template > @@ -2153,7 +2153,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// The value of the strictest alignment of _Types. > static const size_t alignment_value =3D __strictest::_S_alignment; > /// The storage. > - typedef typename aligned_storage<_S_len, alignment_value>::type ty= pe; > + using type =3D typename aligned_storage<_S_len, alignment_value>::= type; > }; > > template > @@ -2200,13 +2200,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > struct __strip_reference_wrapper > { > - typedef _Tp __type; > + using __type =3D _Tp; > }; > > template > struct __strip_reference_wrapper > > { > - typedef _Tp& __type; > + using __type =3D _Tp&; > }; > > // __decay_t (std::decay_t for C++11). > @@ -2233,12 +2233,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > /// Define a member typedef @c type to one of two argument types. > template > struct conditional > - { typedef _Iftrue type; }; > + { using type =3D _Iftrue; }; > > // Partial specialization for false. > template > struct conditional > - { typedef _Iffalse type; }; > + { using type =3D _Iffalse; }; > > /// common_type > template > @@ -2255,7 +2255,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > > template > struct __success_type > - { typedef _Tp type; }; > + { using type =3D _Tp; }; > > struct __failure_type > { }; > @@ -2426,7 +2426,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __result_of_memfun_ref > : private __result_of_memfun_ref_impl > { > - typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; > + using type =3D decltype(_S_test<_MemPtr, _Arg, _Args...>(0)); > }; > > // [func.require] paragraph 1 bullet 2: > @@ -2445,7 +2445,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __result_of_memfun_deref > : private __result_of_memfun_deref_impl > { > - typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; > + using type =3D decltype(_S_test<_MemPtr, _Arg, _Args...>(0)); > }; > > // [func.require] paragraph 1 bullet 3: > @@ -2464,7 +2464,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __result_of_memobj_ref > : private __result_of_memobj_ref_impl > { > - typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; > + using type =3D decltype(_S_test<_MemPtr, _Arg>(0)); > }; > > // [func.require] paragraph 1 bullet 4: > @@ -2483,7 +2483,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __result_of_memobj_deref > : private __result_of_memobj_deref_impl > { > - typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; > + using type =3D decltype(_S_test<_MemPtr, _Arg>(0)); > }; > > template > @@ -2492,13 +2492,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > struct __result_of_memobj<_Res _Class::*, _Arg> > { > - typedef __remove_cvref_t<_Arg> _Argval; > - typedef _Res _Class::* _MemPtr; > - typedef typename __conditional_t<__or_, > + using _Argval =3D __remove_cvref_t<_Arg>; > + using _MemPtr =3D _Res _Class::*; > + using type =3D typename __conditional_t<__or_, > is_base_of<_Class, _Argval>>::value, > __result_of_memobj_ref<_MemPtr, _Arg>, > __result_of_memobj_deref<_MemPtr, _Arg> > - >::type type; > + >::type; > }; > > template > @@ -2507,12 +2507,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > struct __result_of_memfun<_Res _Class::*, _Arg, _Args...> > { > - typedef typename remove_reference<_Arg>::type _Argval; > - typedef _Res _Class::* _MemPtr; > - typedef typename __conditional_t::valu= e, > + using _Argval =3D typename remove_reference<_Arg>::type; > + using _MemPtr =3D _Res _Class::*; > + using type =3D typename __conditional_t::value, > __result_of_memfun_ref<_MemPtr, _Arg, _Args...>, > __result_of_memfun_deref<_MemPtr, _Arg, _Args...> > - >::type type; > + >::type; > }; > > // _GLIBCXX_RESOLVE_LIB_DEFECTS > @@ -2535,7 +2535,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > template > struct __result_of_impl > { > - typedef __failure_type type; > + using type =3D __failure_type; > }; > > template > @@ -2566,7 +2566,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __result_of_impl > : private __result_of_other_impl > { > - typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type; > + using type =3D decltype(_S_test<_Functor, _ArgTypes...>(0)); > }; > > // __invoke_result (std::invoke_result for C++11) > @@ -2763,14 +2763,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_swappable_impl > : public __swappable_details::__do_is_swappable_impl > { > - typedef decltype(__test<_Tp>(0)) type; > + using type =3D decltype(__test<_Tp>(0)); > }; > > template > struct __is_nothrow_swappable_impl > : public __swappable_details::__do_is_nothrow_swappable_impl > { > - typedef decltype(__test<_Tp>(0)) type; > + using type =3D decltype(__test<_Tp>(0)); > }; > > template > @@ -2853,7 +2853,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_swappable_with_impl > : public __swappable_with_details::__do_is_swappable_with_impl > { > - typedef decltype(__test<_Tp, _Up>(0)) type; > + using type =3D decltype(__test<_Tp, _Up>(0)); > }; > > // Optimization for the homogenous lvalue case, not required: > @@ -2861,14 +2861,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_swappable_with_impl<_Tp&, _Tp&> > : public __swappable_details::__do_is_swappable_impl > { > - typedef decltype(__test<_Tp&>(0)) type; > + using type =3D decltype(__test<_Tp&>(0)); > }; > > template > struct __is_nothrow_swappable_with_impl > : public __swappable_with_details::__do_is_nothrow_swappable_with_im= pl > { > - typedef decltype(__test<_Tp, _Up>(0)) type; > + using type =3D decltype(__test<_Tp, _Up>(0)); > }; > > // Optimization for the homogenous lvalue case, not required: > @@ -2876,7 +2876,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > struct __is_nothrow_swappable_with_impl<_Tp&, _Tp&> > : public __swappable_details::__do_is_nothrow_swappable_impl > { > - typedef decltype(__test<_Tp&>(0)) type; > + using type =3D decltype(__test<_Tp&>(0)); > }; > /// @endcond > > -- > 2.40.1 >