例如,我有一个代码如下
template<class... Ts>
void f(Ts... args)
{
}
传递以下参数时
int j = 5;
int& i = j;
f(i);
和
void g(int& i)
{
f(i);
}
捕获的类型不是int&amp;在上述两种情况下。如何让它捕获int&amp;,与i相同的类型?感谢。
答案 0 :(得分:4)
类型模板参数演绎条带cv-qualifiers和ref-qualifers(它还将数组类型转换为指针类型,函数类型转换为函数指针类型。)
如果您希望引用成为推导类型的一部分,请将其添加到声明符中。 (同样适用于const
。)
template<class... Ts>
void f(Ts&... args);
如果您希望推导的类型是左值引用或右值引用,具体取决于参数是左值还是右值,请使用“通用引用”。
template<class... Ts>
void f(Ts&&... args);
(尽管后者看起来如此,它不意味着“仅接受rvalue”。这种情况非常罕见。对于这种情况,请参阅How to make template rvalue reference parameter ONLY bind to rvalue reference?)
注意:只有当传入的变量被声明为引用时,才有 no 方法来创建一个仅通过引用获取其参数的函数。这是因为引用的行为与其引用的对象完全相同(除非应用decltype
时)。