gpt4 book ai didi

c++ - 可以从 istream_iterator 制作 move_iterator 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:34 26 4
gpt4 key购买 nike

考虑以下代码:

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 &&'

但是,如果您分别用 starteos 替换 mstartmeos(常规迭代器),代码将编译。为什么我不能创建 move_iterators

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

最佳答案

今年早些时候在 std-discussion 新闻组上对此进行了讨论:https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/h7jGY95j1oc

共识似乎是 istream_iterator::referenceT const& 以执行 InputIterator 契约;也就是说,防止用户编写 *it = value;。不幸的是,这也阻止了从缓存值中移动。

作为 T.C.上面提到,把决议发到LWG2106代码将编译;不幸的是,因为 move_iterator::reference 将是 T const&& 它会默默地做错事,很可能调用你类型的复制构造函数。

由于 istream_iterator 在递增时修改缓存值,因此(从语言 POV)对 const_cast 返回对 T& 的引用是合法的。不幸的是(再次)这在这里没有帮助,因为没有简单的方法在 istream_iteratormove_iterator 之间插入 const_cast

可能的解决方案:

  • 编写你自己的 istream_iterator,使用非常量 reference 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 .

关于c++ - 可以从 istream_iterator 制作 move_iterator 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31985373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com