微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。