捕获可变模板类型

Capture the variadic template types?

本文关键字:类型      更新时间:2023-10-16

例如,我有如下代码

template<class... Ts>
void f(Ts... args)
{
}

当传递以下参数

int j = 5;
int& i = j;
f(i);

void g(int& i)
{
    f(i);
}

捕获的类型是int而不是int&在上述两种情况下。如何让它捕获int&与i相同的类型?谢谢。

类型模板形参的演绎去掉了cv-限定符和ref-限定符(它还将数组类型转换为指针类型,将函数类型转换为函数指针类型)

如果您希望引用是推导类型的一部分,请将其添加到声明器中。(const也是如此)

template<class... Ts>
void f(Ts&... args);

如果根据实参是左值还是右值,希望推导出的类型是左值引用还是右值引用,请使用"通用引用"。

template<class... Ts>
void f(Ts&&... args);

(不管后者看起来如何,并不意味着只接受右值)。这是非常罕见的。对于这种情况,请参见如何使模板右值引用参数只绑定到右值引用?)

注意:只有当传入的变量被声明为引用时,没有方法来使函数通过引用接受其参数。这是因为引用的行为总是与它所引用的对象完全相同(除非应用了decltype)。