如何正确传递模板参数?

时间:2017-09-01 18:06:50

标签: c++ c++11 templates parameter-passing rvalue-reference

以下代码无法编译,因为T现在被推断为引用(l值或r值,但这与此无关)。因此,std::vector无法再将T作为参数。有谁知道解决这个问题的方法?谢谢!

template<typename T>
void func( T&& t )
{
    std::vector<T> v;
}

答案:使用std::decay作为评论。

1 个答案:

答案 0 :(得分:1)

如何声明推导类型的参数取决于您计划如何使用参数。在显示的声明中,您将参数声明为转发引用,它根据函数的调用方式推导出模板参数:

  • 如果使用类型为X的左值调用函数,则参数T将为X&
  • 如果使用类型为X的右值调用函数,则参数T将为X

结果参数旨在转发某处,最有可能使用

std::forward<T>(t)

如果你宁愿消耗你的论点(即,论证是某个地方的坑),你可能会被价值所取代(即,你使用f(T t))和std::move(t)这个值它的最终目的地。您可能想要读取参数但不要使用它,在这种情况下,您应该将其作为T const&传递。

假设有意使用转发引用,您应该使用从推导类型获得的相应类型声明std::vector,例如

std::vector<std::decay_t<T>> v;