C++ 新手求助我按应用传递仿函数,而调用结果却像是按值传递,望高手指点啊

/*我通过passed-by-reference传递仿函数,如下*generate_n<back_insert_iterator<list<int>>,*int,IntS... /* 我通过passed-by-reference传递仿函数,如下
* generate_n<back_insert_iterator<list<int> >,
* int, IntSequence&>(back_inserter(coll),
* 但是对象seq的数据value却没有改变这是怎么回事
* 望高手指正
* PRINT_ELEMENT()函数是我编写用来打印所有容器元素
*/

#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
#include "Print.h"
using namespace std;

class IntSequence {
private:
int value;
public:
IntSequence(int initialValue)
: value(initialValue) {}
int get_value(){
return value; }

int operator() () {
return value++;
}
};

int main()
{
list<int> coll;
IntSequence seq(1);
generate_n<back_insert_iterator<list<int> >,
int, IntSequence&>(back_inserter(coll),
4,
seq);

PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
IntSequence(42));

PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);

generate_n(back_inserter(coll),
4,
seq);
PRINT_ELEMENTS(coll);

}

// print头文件的源代码
// print.h
#ifndef PRINT_H
#define PRINT_H
#include <iostream>
template<typename T>
inline void PRINT_ELEMENTS(T CONT)
{
typename T::const_iterator pos;
typename T::const_iterator end(CONT.end());

for(pos = CONT.begin(); pos!=end; ++pos) {
std::cout << *pos << ' '; }
std::cout << std::endl;
}

#endif

/* 应该显示这样的结果啊
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 5 6 7 8
* 1 2 3 4 42 43 44 45 5 6 7 8 5 6 7 8
*/
/* 可我得到的结果却是这样的
* 1 2 3 4
* 1 2 3 4 42 43 44 45
* 1 2 3 4 42 43 44 45 1 2 3 4
* 1 2 3 4 42 43 44 45 1 2 3 4 1 2 3 4
*/
展开
 我来答
leoparadox
2012-09-16 · TA获得超过263个赞
知道小有建树答主
回答量:190
采纳率:0%
帮助的人:210万
展开全部
seq一直没变,所以始终输出1 2 3 4

int main()
{
list<int> coll;
IntSequence seq(1);

generate_n<back_insert_iterator<list<int> >, int, IntSequence&>(back_inserter(coll), 4, seq); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, IntSequence(42)); PRINT_ELEMENTS(coll);
IntSequence seq1(5); // 加上这句
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
generate_n(back_inserter(coll), 4, seq1); PRINT_ELEMENTS(coll);
return 0;
}
追问
嗯,我的意思再不加 IntSequence seq1(5); 这条代码的情况下实现
麻烦你看下我的这条代码
generate_n >,
int, IntSequence&>(back_inserter(coll),
4,
seq);
其中intSequence&>这儿不是按值传递,而是按引用传递(&有取址符)按引用传递调用函数是有副作用的,所以这儿seq应该改变了状态(seq的数据value从1变成了5),为什么seq一直没变呢
追答
我用vc++2010跟进generate_n

template inline
void generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
{ // replace [_Dest, _Dest + _Count) with _Func()
_DEBUG_POINTER(_Dest);
_DEBUG_POINTER(_Func);
_Generate_n(_Dest, _Count, _Func,
_Is_checked(_Dest));
}

当调用_Generate_n时,模板会将引用类型转换为实际类,所以此时的_Func已经是seq通过拷贝构造函数生成的新的对象._Generate_n源码如下:

template inline
void _Generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func,
_STD tr1::true_type)
{ // replace [_Dest, _Dest + _Count) with _Func(), checked dest
_Generate_n1(_Dest, _Count, _Func,
_Iter_cat(_Dest));
}

在这里已经是按值传参了.所以generate_n执行完后seq不变.
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式