1

我有一个在 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 时,它会尝试获取我的“参考”地址。

是否有 C++11 替代 boost::reverse_iterator,或者我需要从头开始为我的应用程序编写一个?

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

如果我使用 boost::reverse_iterator,一切都对我有用。

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

特别是,std::reverse_iterator 的 operator->() 不适用于代理类型。该运算符需要返回一个指向值类型的指针。它试图通过取消引用迭代器然后获取它获得的值的地址来做到这一点。在这种情况下,取消引用迭代器会返回一个代理,而不是一个引用,并且获取它的地址是获取一个右值的地址,这会在 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 没有。

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

4

0 回答 0