mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-24 20:29:39 +08:00
[libc++] Implement P0608R3 - A sane variant converting constructor
Summary: Prefer user-defined conversions over narrowing conversions and conversions to bool. References: http://wg21.link/p0608 Reviewers: EricWF, mpark, mclow.lists Reviewed By: mclow.lists Subscribers: zoecarver, ldionne, libcxx-commits, cfe-commits, christof Differential Revision: https://reviews.llvm.org/D44865 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@363692 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1098,11 +1098,39 @@ struct __overload<> { void operator()() const; };
|
||||
template <class _Tp, class... _Types>
|
||||
struct __overload<_Tp, _Types...> : __overload<_Types...> {
|
||||
using __overload<_Types...>::operator();
|
||||
__identity<_Tp> operator()(_Tp) const;
|
||||
|
||||
static auto __test(_Tp (&&)[1]) -> __identity<_Tp>;
|
||||
|
||||
template <class _Up>
|
||||
auto operator()(_Tp, _Up&& __t) const
|
||||
-> decltype(__test({ _VSTD::forward<_Up>(__t) }));
|
||||
};
|
||||
|
||||
template <class _Base, class _Tp>
|
||||
struct __overload_bool : _Base {
|
||||
using _Base::operator();
|
||||
|
||||
template <class _Up, class _Ap = __uncvref_t<_Up>>
|
||||
auto operator()(bool, _Up&&) const
|
||||
-> enable_if_t<is_same_v<_Ap, bool>, __identity<_Tp>>;
|
||||
};
|
||||
|
||||
template <class... _Types>
|
||||
struct __overload<bool, _Types...>
|
||||
: __overload_bool<__overload<_Types...>, bool> {};
|
||||
template <class... _Types>
|
||||
struct __overload<bool const, _Types...>
|
||||
: __overload_bool<__overload<_Types...>, bool const> {};
|
||||
template <class... _Types>
|
||||
struct __overload<bool volatile, _Types...>
|
||||
: __overload_bool<__overload<_Types...>, bool volatile> {};
|
||||
template <class... _Types>
|
||||
struct __overload<bool const volatile, _Types...>
|
||||
: __overload_bool<__overload<_Types...>, bool const volatile> {};
|
||||
|
||||
template <class _Tp, class... _Types>
|
||||
using __best_match_t = typename result_of_t<__overload<_Types...>(_Tp&&)>::type;
|
||||
using __best_match_t =
|
||||
typename invoke_result_t<__overload<_Types...>, _Tp, _Tp>::type;
|
||||
|
||||
} // __variant_detail
|
||||
|
||||
|
||||
Reference in New Issue
Block a user