- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下代码:
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
,使用非常量 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/
我查看了 std::move_iterator 的 STL 源代码并发现它返回 Iterator::value_type&& .当 Iterator::reference 时,这会导致不正确的行为是右
如果我理解正确,a=std::move(b) 将引用 a 绑定(bind)到 b 的地址。而且这个操作之后b指向的内容是不保证的。 move_iterator的实现here有这条线 auto oper
std::move_iterator 有意义吗?适配器只是继承了模板参数Iterator类型的迭代器类别? 因为前向迭代器要求引用类型为 cv- T&但是,对于前向迭代器模板,std::move_it
我有一个 std:vector,其中 MyClass 不能被复制(复制构造函数和赋值构造函数被删除),但可以移动 我想在 for 循环中访问元素,我该怎么做: for(MyClass c : my_v
考虑以下代码: typedef istream_iterator char_itr ; char_itr eos; string ll("some text here"); istringstream
我对此不太确定,所以请解释一下它是如何工作的。 让我们考虑以下代码。 std::vector vec {}; void add (std::vector&& v) { using iter
我是一名优秀的程序员,十分优秀!