加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 可以从istream_iterator中创建move_iterator吗?

发布时间:2020-12-16 07:13:21 所属栏目:百科 来源:网络整理
导读:考虑以下代码: typedef istream_iteratorchar char_itr ;char_itr eos;string ll("some text here");istringstream line_in(ll);char_itr start(line_in);move_iteratorchar_itr mstart(start); // !!!move_iteratorchar_itr meos(eos);vectorchar vc(mstar
考虑以下代码:

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?

编辑:
对于那些想知道我为什么要从流/字符串中移动字符的人.实际问题涉及比char更复杂的数据类型,应避免从字符串复制. char仅仅是为了简单起见而使用,以呈现导致错误的机制.

解决方法

今年早些时候在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;
>编写自己的move_iterator执行const_cast;
>编写一个插入的const_cast迭代器;
>在值类型周围使用可变包装器.

后一种选择非常简单:

template<class T>
  struct mutable_wrapper {
    T mutable value;
    operator T&() const { return value; }
  };
// ...
using itr = std::istream_iterator<mutable_wrapper<MyType>>;

Example.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读