Check in SFINAE base class for use in optional/variant
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@278643 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -479,6 +479,63 @@ struct _LIBCPP_TYPE_VIS __check_tuple_constructor_fail {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if _LIBCPP_STD_VER > 14
|
||||||
|
|
||||||
|
template <bool _CanCopy, bool _CanMove>
|
||||||
|
struct __sfinae_ctor_base {};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_ctor_base<false, false> {
|
||||||
|
__sfinae_ctor_base() = default;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_ctor_base<true, false> {
|
||||||
|
__sfinae_ctor_base() = default;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base const&) = default;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base &&) = delete;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_ctor_base<false, true> {
|
||||||
|
__sfinae_ctor_base() = default;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base const&) = delete;
|
||||||
|
__sfinae_ctor_base(__sfinae_ctor_base &&) = default;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base const&) = default;
|
||||||
|
__sfinae_ctor_base& operator=(__sfinae_ctor_base&&) = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <bool _CanCopy, bool _CanMove>
|
||||||
|
struct __sfinae_assign_base {};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_assign_base<false, false> {
|
||||||
|
__sfinae_assign_base() = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_assign_base<true, false> {
|
||||||
|
__sfinae_assign_base() = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = default;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = delete;
|
||||||
|
};
|
||||||
|
template <>
|
||||||
|
struct __sfinae_assign_base<false, true> {
|
||||||
|
__sfinae_assign_base() = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base const&) = default;
|
||||||
|
__sfinae_assign_base(__sfinae_assign_base &&) = default;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base const&) = delete;
|
||||||
|
__sfinae_assign_base& operator=(__sfinae_assign_base&&) = default;
|
||||||
|
};
|
||||||
|
#endif // _LIBCPP_STD_VER > 14
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // _LIBCPP___TUPLE
|
#endif // _LIBCPP___TUPLE
|
||||||
|
|||||||
Reference in New Issue
Block a user