为了账号安全,请及时绑定邮箱和手机立即绑定

在VS2010下该怎么改才能和DEVCPP一样啊?

在VS2010下该怎么改才能和DEVCPP一样啊?

开心每一天1111 2023-04-10 17:13:55
#include <iostream>#include <list>#include <algorithm>using namespace std;template <class T>void PRINT_ELEMENTS (const T& coll, const char* optcstr =""){typename T::const_iterator pos;std::cout << optcstr;for (pos=coll.begin(); pos!=coll.end(); ++pos) {std::cout << *pos << ' ';}std::cout << std::endl;}class IntSequence{private:int _value;public:IntSequence( int initialValue ) : _value( initialValue ){}int operator()( ){ return _value++; }int value(){ return _value; }};int main(){list< int > coll;IntSequence seq( 1 );generate_n< back_insert_iterator< list<int> >, int,IntSequence& >( back_inserter(coll), 4, seq ); // seq欲传引用,改变seq._value的值PRINT_ELEMENTS( coll );generate_n( back_inserter(coll), 4, IntSequence(42) );PRINT_ELEMENTS( coll );generate_n( back_inserter(coll), 4, const_cast<IntSequence &>(seq) );PRINT_ELEMENTS( coll );generate_n( back_inserter(coll), 4, const_cast<IntSequence &>(seq) );PRINT_ELEMENTS( coll );}//在dev-cpp下输出如下:1 2 3 41 2 3 4 42 43 44 451 2 3 4 42 43 44 45 5 6 7 81 2 3 4 42 43 44 45 5 6 7 8 5 6 7 8请按任意键继续. . .//而在VS2010下输出如下:1 2 3 41 2 3 4 42 43 44 451 2 3 4 42 43 44 45 1 2 3 41 2 3 4 42 43 44 45 1 2 3 4 1 2 3 4请按任意键继续. . .
查看完整描述

1 回答

?
森栏

TA贡献1810条经验 获得超5个赞

你说的问题在VS2008上也是相同的表现,这个是因为微软的库实现不是直接实现在你call的generate_n这个函数上的,而是有好几重转调,所以造成你即使对第一重调用的 模板函数用 引用去实例化,由于后面转调的函数都是使用值去实例化的,所以实际你得到的运行效果还是值语义的。

比如你call 函数 func1<A&>(), 但是由于func1<A&>() 调用了func2<A>(), 又继续调用了func3<A>(), 最后func3里操作的其实是一个值拷贝,所以影响不到外面的引用的对象。

查看完整回答
反对 回复 2023-04-12
  • 1 回答
  • 0 关注
  • 170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信