假设你有一个迭代器,它实际上是一个代理并包含它返回的数据,你怎么能做一个反向迭代器呢?
std::reverse_iterator 取消引用运算符的实现创建一个临时对象,然后它递减和取消引用,其代码如下所示:
reference operator*() const {
iterator tmp = current;
return *--tmp;
}
结果是,它返回给您的是一个指向在您掌握它之前超出范围的数据的指针。
这产生了相当不幸的结果。
你怎么能解决这个问题?
看起来您需要为此特定情况编写自己的自定义反向迭代器实现,因为您的迭代器类型与reverse_iterator的此特定实现不兼容。
根据 http://en.cppreference.com/w/cpp/iterator/reverse_iterator 的说法,一些实现确实存储了迭代器的递减副本,但不是全部。 Boost::reverse_iterator 似乎没有存储额外的副本。
我认为标准库实现不正确。如果您查看 C++11 标准中的 24.5.1.3.4 [reverse.iter.op.star],您会发现以下内容:
deref_tmp = current;
--deref_tmp;
return *deref_tmp;
注: 此操作必须使用辅助成员变量而不是临时变量,以避免返回在关联迭代器的生存期之后持续存在的引用。
在标准deref_tmp
中是 reverse_iterator
的仅用于展示的数据成员。