请考虑以下代码段:
class Base
{
public:
template <typename...Ts>
void fun(Ts... vs)
{
cout << "Base::fun" << endl;
cout << __FUNCSIG__ << endl;
}
};
template <typename...Ts>
class Derived : public Base
{
public:
void dfun(Ts... vs)
{
cout << "Derived::dfun" << endl;
cout << __FUNCSIG__ << endl;
fun(vs...);
}
};
int main()
{
int i = 10;
int & a = i;
Derived<int, int &> d;
d.dfun(i, a);
}
在VS2013中运行上面的代码时,我得到Derived :: dfun中的参数包值推导的类型是(int,int&amp;),其中Base :: fun是(int,int)。为什么传递参数时参考性会丢失?
如果dfun和fun是免费功能,则保留参考性。为什么会出现这种差异?
如果我将Base :: fun的签名更改为Base :: fun(Ts&amp;&amp; ... vs),则会再次保留参考性。