tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>()
&& _TMCT<_UElements...>::template
- _ImplicitlyConvertibleTuple<_UElements...>(),
+ _ImplicitlyConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a,
const tuple<_UElements...>& __in)
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_ConstructibleTuple<_UElements...>()
&& !_TMCT<_UElements...>::template
- _ImplicitlyConvertibleTuple<_UElements...>(),
+ _ImplicitlyConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
const tuple<_UElements...>& __in)
static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& _TMCT<_UElements...>::template
- _ImplicitlyMoveConvertibleTuple<_UElements...>(),
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=true>
tuple(allocator_arg_t __tag, const _Alloc& __a,
tuple<_UElements...>&& __in)
static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
{ }
- template<typename _Alloc, typename... _UElements, typename
+ template<typename _Alloc, typename _Dummy = void,
+ typename... _UElements, typename
enable_if<_TMCT<_UElements...>::template
_MoveConstructibleTuple<_UElements...>()
&& !_TMCT<_UElements...>::template
- _ImplicitlyMoveConvertibleTuple<_UElements...>(),
+ _ImplicitlyMoveConvertibleTuple<_UElements...>()
+ && _TNTC<_Dummy>::template
+ _NonNestedTuple<tuple<_UElements...>&&>(),
bool>::type=false>
explicit tuple(allocator_arg_t __tag, const _Alloc& __a,
tuple<_UElements...>&& __in)
std::tuple<std::tuple<X>> t3{std::move(t2)};
}
+void f4()
+{
+ std::allocator<X> a;
+ X v;
+ std::tuple<X> t1{std::allocator_arg, a, v};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
+void f5()
+{
+ std::allocator<X> a;
+ X v;
+ std::tuple<X> t1{std::allocator_arg, a, std::move(v)};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
+void f6()
+{
+ std::allocator<X> a;
+ std::tuple<X> t1{std::allocator_arg, a, X{}};
+ std::tuple<std::tuple<X>&&> t2{std::allocator_arg, a, std::move(t1)};
+ std::tuple<std::tuple<X>> t3{std::allocator_arg, a, std::move(t2)};
+}
+
int main()
{
f();
f3();
VERIFY(result == "DefMoveDtorMoveDtorDtor");
result = "";
+ f4();
+ VERIFY(result == "DefCopyMoveDtorDtorDtor");
+ result = "";
+ f5();
+ VERIFY(result == "DefMoveMoveDtorDtorDtor");
+ result = "";
+ f6();
+ VERIFY(result == "DefMoveDtorMoveDtorDtor");
+ result = "";
}