如何正确传递模板参数?
问题描述:
下面的代码不能编译,因为T
现在被推断为引用(l值或r值,但这里不相关)。所以std::vector
不能以T
作为论据。有谁知道一些方法来解决这个问题?谢谢!如何正确传递模板参数?
template<typename T>
void func(T&& t)
{
std::vector<T> v;
}
答:使用std::decay
的评论。
答
如何声明具有推导类型的参数取决于您计划如何使用参数。在图示的声明中你声明的参数作为转发参考其推导取决于函数是如何被调用模板参数:
- 如果函数被调用类型
X
参数的左值T
将X&
- 如果函数调用类型
X
参数的一个rvalueT
将X
所得参数是INTE nded是转发的地方,并使用
std::forward<T>(t)
是最有可能使用的。如果你愿意消耗你的论点(即参数是坑的地方),你可能击败了由值(即,你”把它d使用f(T t)
)和std::move(t)
将其值转换为其最终目的地。您可能需要阅读参数,但不要使用它,在这种情况下,您应该将其作为T const&
传递给它。
假设使用转发参考是故意的,您应该声明std::vector
具有从推导的类型获得的相应类型,例如,
std::vector<std::decay_t<T>> v;
请提供一个[MCVE]来产生您遇到的问题。 –
使用['std :: decay'](http://en.cppreference.com/w/cpp/types/decay) – SirGuy
谢谢SirGuy!有效! – Dave