比方说,我用std::forward_as_tuple
给函数调用的参数存储在一个元组模拟与性病的std ::向前:: forward_as_tuple
auto args = std::forward_as_tuple(std::forward<Args>(args)...);
然后,我通过左值引用传递这个元组想要的功能用另一个std::integer_sequence
确定的args
中的一些参数调用函数foo()
。我std::move()
做到像这样
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))...);
}
而且这样的工作,因为std::get<std::tuple>
回报std::tuple_element_t<Index, tuple<Types...>>&&
这与&&
折叠std::tuple_element_t<Index, tuple<Types...>>
因为参考的基准岬的身份转变右值合格的版本。
因此,如果std::tuple_element_t<Index, tuple<Types...>>
的计算结果为T&
返回的类型将是T& &&
这只是T&
。原因类似std::tuple_element_t<Index, tuple<Types...>>
返回T&&
和T
我错过了什么吗?有些情况下会失败吗?
那么,如果你正在移动它,'TupleArgs&args'应该是'TupleArgs args'或'TupleArgs && args'。其他任何情况都会导致传入的对象发生变化,从而使其非常不透明。 – Yakk
@Yakk对,这是需要考虑的事情,它可能更适合作为转发参考。按值传递它只会创建一个底层引用的副本(这也是我猜的好) – Curious
现在它应该是'std :: forward'而不是'move',因为'TupleArgs &&'不必是右后卫;)(如果它是一个右值ref,则foward无论如何都会做正确的事情,这个想法是使代码的正确性成为本地的一个属性) –
Yakk