У меня есть некоторые трудности с идеальной пересылкой.
Вот мой текущий уровень понимания: склейка Template + rvalue reference + std :: forward и активируется специальный магический режим, в котором правила вывода шаблона не имеют того же значения, что обычно, но созданы для обеспечения идеальной пересылки. Пример:
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
Но что произойдет, если T на самом деле является шаблонным классом?
Например, как я могу перенаправить std :: tuple? Если использовать 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>&&
Итак, ясно, что мы все еще находимся в общем, не шаблоне, случае, когда lvalue не может привязаться к rvalue ссылка. «Идеальный режим пересылки» не активирован
Поэтому я попытался скрытно передать свой кортеж в качестве шаблона:
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...>();
}
Но я все равно получаю ту же ошибку.