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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
