通过引用传递函数,我在VS2012上运行它,为什么它会出错

passing functors by reference , i run it on VS2012,why does it make errors?

本文关键字:运行 为什么 出错 VS2012 引用 传递函数 我在      更新时间:2023-10-16

这是我的代码:结果应该是1,2,3,4,5,6,但它仍然是1,2,3,1,2,3。当我在linux上运行它时,它是正确的。谁能告诉我真相。

class IntSequence {
private:
    int value;
public:
    IntSequence(int initialValue) : value(initialValue){}
    int operator() () {
        return value++;
    }
};
int main()
{
    list<int> coll;
    IntSequence seq(1);
    generate_n<back_insert_iterator<list<int> > , int , IntSequence& >
         (back_inserter(coll) , 3 ,seq);//result is 1,2,3
    generate_n (back_inserter(coll) , 3 ,seq);//result should be 1,2,3,4,5,6,but it is still 1,2,3,1,2,3
 }

使用std::ref,否则generate_n将创建一个新的IntSequence函子,增加其值,然后销毁它。

http://ideone.com/pBHum1

list<int> coll;
IntSequence seq(1);
generate_n (back_inserter(coll), 3, std::ref(seq));
generate_n (back_inserter(coll), 3, std::ref(seq));
for (auto& i : coll)
   cout << i << " ";

解释为什么它在visual studio中不起作用:

在VS2015(在您的案例中是2012)中,generate_n调用内部私有函数_generate_n,该函数不接受转发引用或根本不接受引用。相反,它再次按值接受_Fn

因此,即使您通过显式设置模板参数正确地传递了引用,它也会随以下对_generate_n的调用而消失。

我不知道这是否意味着这样。但很可能是这样,因为这就是std::reference_wrapper存在的原因。

相关文章: