参考包通过引用传递

时间:2015-10-25 12:42:47

标签: c++ templates c++11

我写了一个简单的可变参数模板函数,我试图理解它为什么不起作用。 (它的输出对应物完美无缺。)​​

#include <iostream>

void read() {}

template<class curr_t, class... rest_t>
void read(curr_t &var, rest_t... rest)
{
    std::cin >> var;
    read(rest...);
}

int main()
{   
    int a = 0, b = 0, c = 0;

    read(a, b, c); //input: 1 2 3
    std::cout << a << b << c; //output: 1 0 0

    std::cin.ignore();
    std::cin.get();
}       

从评论中可以看出,我为1 2 3输入了a b c,我得到的输出是1 0 0。很明显,只有a才能保存其价值。有人可以解释为什么会发生这种情况,我该怎么做才能解决它?谢谢!

EDIT :: 是的,显然我有参数包的概念错了! 我还试图执行以下操作:rest_t... &rest这给了我一个编译器错误。

相反,如果我写rest_t&... rest,它就会按预期工作。我想这只是我身边的语法错误!感谢任何发布此作为答案的人,并在一分钟后删除了他的答案! d:

1 个答案:

答案 0 :(得分:5)

a通过引用传递,但其他的被复制:当你以递归方式调用它们时,它们是,引用,但它们引用之前通过值传递的变量,因此它不会被修改外部

template<class curr_t, class... rest_t>
void read(curr_t &var, rest_t&... rest)
//                           ^               
{
    std::cin >> var;
    read(rest...);
}