比方說,我用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