Let's say I use std::forward_as_tuple to store the arguments of a function call in a tuple
auto args = std::forward_as_tuple(std::forward<Args>(args)...);
And then I pass this tuple by lvalue reference to a function that wants to invoke a function foo() with some of the arguments in args as determined by another std::integer_sequence. I do it with std::move() like so
template <typename TupleArgs, std::size_t... Indices>
decltype(auto) forward_to_foo(TupleArgs& args,
std::index_sequence<Indices...>) {
return foo(std::get<Indices>(std::move(args))...);
}
And this would work because the rvalue qualified version of std::get<std::tuple> return std::tuple_element_t<Index, tuple<Types...>>&& which is an identity transformation of the reference-ness of the std::tuple_element_t<Index, tuple<Types...>> because of reference collapsing with the &&, so if std::tuple_element_t<Index, tuple<Types...>> evaluates to T& the returned type would be T& && which is just T&. Similar reason for when std::tuple_element_t<Index, tuple<Types...>> returns T&& and T
Am I missing something? Are there some cases where this would fail?
Aucun commentaire:
Enregistrer un commentaire