传递可变参数时保留引用
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。
考虑以下代码片段:
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。