Идеальная пересылка и std :: tuple (или другой шаблонный класс)

У меня есть некоторые трудности с идеальной пересылкой.

Вот мой текущий уровень понимания: склейка 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...>(); 
}

Но я все равно получаю ту же ошибку.

6
задан Johannes Schaub - litb 25 November 2011 в 23:35
поделиться