diff options
-rw-r--r-- | libcxx/include/tuple | 11 | ||||
-rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp | 14 |
2 files changed, 24 insertions, 1 deletions
diff --git a/libcxx/include/tuple b/libcxx/include/tuple index c192d100e14..de30e86c72b 100644 --- a/libcxx/include/tuple +++ b/libcxx/include/tuple @@ -521,6 +521,13 @@ class _LIBCPP_TEMPLATE_VIS tuple template <class ..._Args> static constexpr bool __enable_implicit() { return + __tuple_constructible< + tuple<_Args...>, + typename __make_tuple_types<tuple, + sizeof...(_Args) < sizeof...(_Tp) ? + sizeof...(_Args) : + sizeof...(_Tp)>::type + >::value && __tuple_convertible< tuple<_Args...>, typename __make_tuple_types<tuple, @@ -547,7 +554,8 @@ class _LIBCPP_TEMPLATE_VIS tuple { template <class _Tuple> static constexpr bool __enable_implicit() { - return __tuple_convertible<_Tuple, tuple>::value; + return __tuple_constructible<_Tuple, tuple>::value + && __tuple_convertible<_Tuple, tuple>::value; } template <class _Tuple> @@ -577,6 +585,7 @@ class _LIBCPP_TEMPLATE_VIS tuple template <class _Tuple> static constexpr bool __enable_implicit() { return _And< + __tuple_constructible<_Tuple, tuple>, __tuple_convertible<_Tuple, tuple>, _PreferTupleLikeConstructor<_Tuple> >::value; diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp index f343201447b..2c24f786a54 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/convert_move.pass.cpp @@ -46,6 +46,20 @@ struct D explicit D(int i) : B(i) {} }; +struct BonkersBananas { + template <class T> + operator T() &&; + template <class T, class = void> + explicit operator T() && = delete; +}; + +void test_bonkers_bananas_conversion() { + using ReturnType = std::tuple<int, int>; + static_assert(std::is_convertible<BonkersBananas, ReturnType>(), ""); + static_assert(!std::is_constructible<ReturnType, BonkersBananas>(), ""); + +} + int main(int, char**) { { |