2017-09-01 151 views
1

下面的代码不能编译,因为T现在被推断为引用(l值或r值,但这里不相关)。所以std::vector不能以T作为论据。有谁知道一些方法来解决这个问题?谢谢!如何正确传递模板参数?

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

答:使用std::decay的评论。

+2

请提供一个[MCVE]来产生您遇到的问题。 –

+4

使用['std :: decay'](http://en.cppreference.com/w/cpp/types/decay) – SirGuy

+0

谢谢SirGuy!有效! – Dave

回答

1

如何声明具有推导类型的参数取决于您计划如何使用参数。在图示的声明中你声明的参数作为转发参考其推导取决于函数是如何被调用模板参数:

  • 如果函数被调用类型X参数的左值TX&
  • 如果函数调用类型X参数的一个rvalue TX

所得参数是INTE nded是转发的地方,并使用

std::forward<T>(t) 

是最有可能使用的。如果你愿意消耗你的论点(即参数是坑的地方),你可能击败了由值(即,你”把它d使用f(T t))和std::move(t)将其值转换为其最终目的地。您可能需要阅读参数,但不要使用它,在这种情况下,您应该将其作为T const&传递给它。

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

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