boost :: reverse_iterator是否有C ++ 11替代品?

问题描述

我有一个在C ++ 03上运行的应用程序,该应用程序使用boost :: reverse_iterator。我终于能够升级到C ++ 11编译器,并且注意到已经不再安装boost / iterator / reverse_iterator.hpp(我正在使用Boost 1.74.0)。

我认为这是因为C ++ 11的std :: reverse_iterator取代了它。是这样吗?

我尝试使用std :: reverse_iterator代替boost :: reverse_iterator,但是它对我不起作用。原因是我的基本迭代器尽管是随机访问的,但它不是真正的STL“随机访问迭代器”,因为它的引用类型是代理,而不是真正的引用。当我使用std :: reverse_iterator时,它将尝试获取我的“引用”的地址。

boost :: reverse_iterator是否有C ++ 11替代品,还是我需要为应用程序从头编写一个

编辑:对不起-你是对的,在boost 1.74.0中boost :: reverse_iterator仍然存在。我的包含路径有问题,我错过了。

如果我使用boost :: reverse_iterator,一切对我来说都是正常的。

如果std :: reverse_iterator应该与代理引用类型一起使用,那么我很好奇为什么代码不起作用。更确切地说,我可以理解为什么它会失败,但是在我看来std :: reverse_iterator似乎并不完全支持代理类型。

特别是,std :: reverse_iterator的operator->()不适用于代理类型。该运算符需要返回一个指向值类型的指针。它尝试通过取消引用迭代器,然后获取获取值的地址来实现此目的。在这种情况下,取消对迭代器的引用会返回一个代理而不是引用,并且获取其地址就是获取rvalue的地址,这会在g ++ 8.3.1中生成错误

/usr/include/c++/8/bits/stl_iterator.h:184:32: error: cannot bind non-const lvalue reference of type 'MyProxyType&' to an rvalue of type 'std::reverse_iterator<MyIteratorType>::reference' {aka 'MyProxyType'}
   { return std::__addressof(operator*()); }

如果我使用std :: reverse_iterator并将i->的实例替换为(* i)。,则它可以工作,但这并不是迭代器的行为方式。

我的迭代器(MyIteratorType)是使用boost :: iterator_adaptor构建的,该文档说他们使用未指定的技巧来使operator->适用于代理类型。看起来boost :: reverse_iterator在基本迭代器的版本之上构建其operator->,因此它利用了这些技巧,而std :: reverse_iterator没有。

如果有人知道更多细节,我将很感兴趣!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)