Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递可变参数时保持引用性_C++_C++11_Variadic Templates_Variadic Functions - Fatal编程技术网

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它没有丢失,因为编译器不必找出所涉及的类型,它们已经在函数的签名中提供了。