C++ 传递可变参数时保持引用性
考虑以下代码段:C++ 传递可变参数时保持引用性,c++,c++11,variadic-templates,variadic-functions,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 :
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);
}
类基
{
公众:
模板
虚无乐趣(Ts…vs)
{
cout在模板推断过程中,引用类型将被推断为它们所引用的类型。因此int&
将被推断为int
。这就是导致您看到的行为的原因
请参阅以获得更详细的解释。表达式的引用性无法观察到。也就是说,当您观察id表达式的类型a
,它是int
而不是int&
(通常缩写为“表达式没有引用类型”)@dyp,但为什么它在派生::dfun()中可以观察到另外,如果dfun()和fun()是非成员?Base::fun
使用类型推断。它是一个函数模板,其模板参数是从调用中的参数表达式推导出来的,如fun(vs.)
-这里,您观察参数表达式的类型vs..
,它从不产生引用。Oth,派生::dfun
不是函数模板。它有固定数量和固定类型的参数,由其成员的类决定。如果您将调用更改为fun(std::forward(vs);
您将观察到int,int&
@dyp:;)但是如果dfun()和fun()不涉及类型推断吗是自由函数模板而不是类成员吗?即使这样引用也应该丢失,但它不是…为什么?@Arun它没有丢失,因为编译器不必找出所涉及的类型,它们已经在函数的签名中提供了。