传递可变参数时保留引用

Preserving referenceness when passing variadic arguments

考虑以下代码片段:

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&),而在 Base::fun 中是 (int,诠释)。为什么在传递参数时引用性丢失?

如果 dfun 和 fun 是自由函数,则保留引用性。为什么会有这种差异?

如果我将 Base::fun 的签名更改为 Base::fun(Ts&&... vs),引用将再次保留。

在模板推导期间,引用类型将推导为它们所引用的类型。所以 int& 将被推断为 int。这就是导致您所看到的行为的原因。

有关更详细的说明,请参阅 here