传递可变参数时保持参考性

时间:2015-04-24 22:20:13

标签: c++ c++11 variadic-templates variadic-functions

请考虑以下代码段:

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),则会再次保留参考性。

1 个答案:

答案 0 :(得分:2)

在模板扣除期间,引用类型将推断为它们引用的类型。因此,int&将推断为int。这就是造成你所看到的行为的原因。

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