c – 可以从istream_iterator中创建move_iterator吗?
考虑以下代码:
typedef istream_iterator<char> char_itr ; char_itr eos; string ll("some text here"); istringstream line_in(ll); char_itr start(line_in); move_iterator<char_itr> mstart(start); // !!! move_iterator<char_itr> meos(eos); vector<char> vc(mstart,meos); 上面的代码因为行(!!!)而无法编译: error C2440: 'return' : cannot convert from 'const char' to 'char &&' 但是如果你分别用start和eos替换mstart和meos(常规迭代器),代码就会编译.为什么我不能做move_iterators? 编辑: 解决方法
今年早些时候在std-discussion新闻组上讨论了这个问题:
https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/h7jGY95j1oc
共识似乎是istream_iterator :: reference是T const&强制执行InputIterator合同;也就是说,防止用户写* it = value;.不幸的是,这也阻止了从缓存值移动. 作为T.C.如上所述,将决议发布到LWG2106代码将编译;不幸的是因为move_iterator :: reference将是T const&&它会默默地做错事,最有可能调用你的类型的复制构造函数. 由于istream_iterator在递增时修改缓存值,因此(从语言POV)合法到const_cast返回对T&的引用.不幸的是(再一次)在这里没有帮助,因为没有简单的方法在istream_iterator和move_iterator之间插入const_cast. 可能的解决方法: >编写自己的istream_iterator,使用非const引用typedef; 后一种选择非常简单: template<class T> struct mutable_wrapper { T mutable value; operator T&() const { return value; } }; // ... using itr = std::istream_iterator<mutable_wrapper<MyType>>; Example. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |