我在完美转发方面遇到了一些困难。
这是我目前的理解水平:胶水模板 + 右值引用 + 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>&&
很明显,我们仍然处于一般的、非模板的情况下,左值不能绑定到右值引用。“完美转发模式”未激活
所以我试图偷偷摸摸地将我的元组作为模板模板传递:
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...>();
}
但我仍然得到同样的错误。