完美轉發有一些困難。完美轉發和std ::元組(或其他模板類)
這裏是我目前的理解水平:glue Template + rvalue reference + std :: forward以及一個特殊的魔法模式,在模板扣除規則與通常意義不同的情況下被激活,但是被製作爲允許完美轉發。例如:
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
但是如果T實際上是一個模板類,會發生什麼?例如,我如何完善一個std ::元組?如果使用T & &作爲aboce,我將丟失包含在元組中的對象的所有類型信息。
但是下面的代碼不能工作:
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
末GCC快照說:
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
所以很明顯,我們仍然在一般情況下,非模板情況下左值不能綁定給右值參考。 「完美forwading模式」未激活
於是,我就偷偷摸摸,並通過我的元組爲模板,模板:
template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
但我仍然得到同樣的錯誤。
難道你不能只調用std :: forward而沒有指定類型(因爲它是一個模板函數,可以使用演繹)? 'std :: forward(t)' – SoapBox