[libcxx-commits] [libcxx] r373263 - Refactor default constructor SFINAE in pair and tuple.
Eric Fiselier via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Sep 30 13:55:30 PDT 2019
Author: ericwf
Date: Mon Sep 30 13:55:30 2019
New Revision: 373263
URL: http://llvm.org/viewvc/llvm-project?rev=373263&view=rev
Log:
Refactor default constructor SFINAE in pair and tuple.
Refactor the recent implicit default constructor changes to match the
existing SFINAE style.
Modified:
libcxx/trunk/include/__tuple
libcxx/trunk/include/tuple
libcxx/trunk/include/utility
Modified: libcxx/trunk/include/__tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__tuple?rev=373263&r1=373262&r2=373263&view=diff
==============================================================================
--- libcxx/trunk/include/__tuple (original)
+++ libcxx/trunk/include/__tuple Mon Sep 30 13:55:30 2019
@@ -477,8 +477,9 @@ using __tuple_like_with_size _LIBCPP_NOD
>;
struct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail {
- template <class ...>
- static constexpr bool __enable_default() { return false; }
+
+ static constexpr bool __enable_explicit_default() { return false; }
+ static constexpr bool __enable_implicit_default() { return false; }
template <class ...>
static constexpr bool __enable_explicit() { return false; }
template <class ...>
Modified: libcxx/trunk/include/tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/tuple?rev=373263&r1=373262&r2=373263&view=diff
==============================================================================
--- libcxx/trunk/include/tuple (original)
+++ libcxx/trunk/include/tuple Mon Sep 30 13:55:30 2019
@@ -499,23 +499,18 @@ class _LIBCPP_TEMPLATE_VIS tuple
template <class _Dummy>
struct _CheckArgsConstructor<true, _Dummy>
{
- template <class ..._Args>
- struct __enable_implicit_default
- // In C++03, there's no way to implement the resolution of LWG2510.
-#ifdef _LIBCPP_CXX03_LANG
- : true_type
-#else
- : __all<__is_implicitly_default_constructible<_Args>::value...>
-#endif
- { };
+ template <int&...>
+ static constexpr bool __enable_implicit_default() {
+ return __all<__is_implicitly_default_constructible<_Tp>::value... >::value;
+ }
+
+ template <int&...>
+ static constexpr bool __enable_explicit_default() {
+ return
+ __all<is_default_constructible<_Tp>::value...>::value &&
+ !__enable_implicit_default< >();
+ }
- template <class ..._Args>
- struct __enable_explicit_default
- : integral_constant<bool,
- __all<is_default_constructible<_Args>::value...>::value &&
- !__enable_implicit_default<_Args...>::value
- >
- { };
template <class ..._Args>
static constexpr bool __enable_explicit() {
@@ -655,14 +650,14 @@ class _LIBCPP_TEMPLATE_VIS tuple
public:
template <bool _Dummy = true, _EnableIf<
- _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>::value
+ _CheckArgsConstructor<_Dummy>::__enable_implicit_default()
, void*> = nullptr>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
tuple()
_NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {}
template <bool _Dummy = true, _EnableIf<
- _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>::value
+ _CheckArgsConstructor<_Dummy>::__enable_explicit_default()
, void*> = nullptr>
explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
tuple()
@@ -671,11 +666,8 @@ public:
tuple(tuple const&) = default;
tuple(tuple&&) = default;
- template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf<
- _And<
- _IsSame<allocator_arg_t, _AllocArgT>,
- typename _CheckArgsConstructor<_Dummy>::template __enable_implicit_default<_Tp...>
- >::value
+ template <class _AllocArgT, class _Alloc, _EnableIf<
+ _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value >::__enable_implicit_default()
, void*> = nullptr
>
_LIBCPP_INLINE_VISIBILITY
@@ -685,11 +677,8 @@ public:
typename __make_tuple_indices<sizeof...(_Tp), 0>::type(),
__tuple_types<_Tp...>()) {}
- template <class _AllocArgT, class _Alloc, bool _Dummy = true, _EnableIf<
- _And<
- _IsSame<allocator_arg_t, _AllocArgT>,
- typename _CheckArgsConstructor<_Dummy>::template __enable_explicit_default<_Tp...>
- >::value
+ template <class _AllocArgT, class _Alloc, _EnableIf<
+ _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value>::__enable_explicit_default()
, void*> = nullptr
>
explicit _LIBCPP_INLINE_VISIBILITY
Modified: libcxx/trunk/include/utility
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?rev=373263&r1=373262&r2=373263&view=diff
==============================================================================
--- libcxx/trunk/include/utility (original)
+++ libcxx/trunk/include/utility Mon Sep 30 13:55:30 2019
@@ -334,22 +334,17 @@ struct _LIBCPP_TEMPLATE_VIS pair
using _EnableB _LIBCPP_NODEBUG_TYPE = typename enable_if<_Val, bool>::type;
struct _CheckArgs {
- template <class _U1, class _U2>
+ template <int&...>
static constexpr bool __enable_explicit_default() {
- return is_default_constructible<_U1>::value
- && is_default_constructible<_U2>::value
- && !__enable_implicit_default<_U1, _U2>();
+ return is_default_constructible<_T1>::value
+ && is_default_constructible<_T2>::value
+ && !__enable_implicit_default<>();
}
- template <class _U1, class _U2>
+ template <int&...>
static constexpr bool __enable_implicit_default() {
- // In C++03, there's no way to implement the resolution of LWG2510.
-#ifdef _LIBCPP_CXX03_LANG
- return true;
-#else
- return __is_implicitly_default_constructible<_U1>::value
- && __is_implicitly_default_constructible<_U2>::value;
-#endif
+ return __is_implicitly_default_constructible<_T1>::value
+ && __is_implicitly_default_constructible<_T2>::value;
}
template <class _U1, class _U2>
@@ -400,7 +395,7 @@ struct _LIBCPP_TEMPLATE_VIS pair
>::type;
template<bool _Dummy = true, _EnableB<
- _CheckArgsDep<_Dummy>::template __enable_explicit_default<_T1, _T2>()
+ _CheckArgsDep<_Dummy>::__enable_explicit_default()
> = false>
explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value &&
@@ -408,7 +403,7 @@ struct _LIBCPP_TEMPLATE_VIS pair
: first(), second() {}
template<bool _Dummy = true, _EnableB<
- _CheckArgsDep<_Dummy>::template __enable_implicit_default<_T1, _T2>()
+ _CheckArgsDep<_Dummy>::__enable_implicit_default()
> = false>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
pair() _NOEXCEPT_(is_nothrow_default_constructible<first_type>::value &&
More information about the libcxx-commits
mailing list