以下代码无法编译,因为T
现在被推断为引用(l值或r值,但这与此无关)。因此,std::vector
无法再将T
作为参数。有谁知道解决这个问题的方法?谢谢!
template<typename T>
void func( T&& t )
{
std::vector<T> v;
}
答案:使用std::decay
作为评论。
答案 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;