【问题标题】:Parameter pack passed by reference通过引用传递的参数包
【发布时间】:2015-10-25 20:59:45
【问题描述】:

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

#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();
}       

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

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

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

【问题讨论】:

  • 也许它与rest 被传值有关?
  • 你不认为函数read会无限递归吗?
  • 但据我了解,作为参数包“解包”,包的第一个元素(在这种情况下)变为 curr_t &var。
  • @vishal 为什么会无限递归?
  • @vishal 这就是read() 存在的原因,它可以捕获使用零参数调用read,这最终会在rest... 为空时发生。

标签: c++ templates c++11


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2010-10-07
    • 1970-01-01
    • 2011-08-21
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多