通过引用传递函数,我在VS2012上运行它,为什么它会出错
passing functors by reference , i run it on VS2012,why does it make errors?
这是我的代码:结果应该是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
存在的原因。
相关文章:
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 为什么std::async使用同一个线程运行函数
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 为什么此代码存在运行时错误?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 为什么我的两个 cin 语句没有在程序结束时运行?
- 为什么当 vector 为空时会显示运行时错误?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 为什么这些算法的运行速度比它们应该的要快?
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 为什么我的代码在指针方面停止运行?
- 试图找出为什么我会收到运行时错误?
- 我的程序运行良好,可以复制对象,但是当我使用复制分配(=)时,它仍然可以正常运行.为什么不给错误
- 当我尝试为我的程序提供 3 个输入时,它需要 4 个才能正常运行.为什么