@@ -27,17 +27,20 @@ using EnableIfTupleEnd =
2727
2828// ------------------------------------------------------------------------------
2929template <typename T>
30- void assignFromTupleElement (Variant& v, T&& elem)
30+ T&& forwardTupleElement( T&& elem)
3131{
3232 static_assert (ArgTraits<T>::isValid,
3333 " wamp::fromTuple - Invalid tuple element type" );
34- v = std::move (elem);
34+ // Normally this should be std::forward, but this function is only called by
35+ // assignFromTuple below, so elem is always actually an rvalue reference, so
36+ // using std::move is sufficient.
37+ return std::move (elem);
3538}
3639
3740template <typename ... Ts>
38- void assignFromTupleElement (Variant& v, std::tuple<Ts...>&& tuple)
41+ Array forwardTupleElement ( std::tuple<Ts...>&& tuple)
3942{
40- v = toArray (std::move (tuple));
43+ return toArray (std::move (tuple));
4144}
4245
4346template <std::size_t N = 0 , typename ... Ts, EnableIfTupleEnd<N, Ts...> = 0 >
@@ -46,8 +49,7 @@ void assignFromTuple(Array&, std::tuple<Ts...>&&) {}
4649template <std::size_t N = 0 , typename ... Ts, EnableIfTupleElement<N, Ts...> = 0 >
4750void assignFromTuple (Array& array, std::tuple<Ts...>&& tuple)
4851{
49- array.emplace_back ();
50- assignFromTupleElement (array.back (), std::get<N>(std::move (tuple)));
52+ array.emplace_back (forwardTupleElement (std::get<N>(std::move (tuple))));
5153 assignFromTuple<N+1 , Ts...>(array, std::move (tuple));
5254}
5355
0 commit comments