boost::reverse_iterator を使用する C++03 で実行されているアプリケーションがあります。ようやく C++11 コンパイラにアップグレードできましたが、boost/iterator/reverse_iterator.hpp がインストールされていないことに気付きました (Boost 1.74.0 を使用しています)。
C++11 の std::reverse_iterator がその代わりになるためだと思います。そうですか?
boost::reverse_iterator の代わりに std::reverse_iterator を使用してみましたが、うまくいきません。その理由は、参照型が真の参照ではなくプロキシであるため、私のベース イテレータはランダム アクセスですが、真の STL「ランダム アクセス イテレータ」ではないためです。std::reverse_iterator を使用すると、「参照」のアドレスを取得しようとします。
boost::reverse_iterator に代わる C++11 はありますか?それともアプリケーション用にゼロから作成する必要がありますか?
編集: 申し訳ありませんが、boost::reverse_iterator がまだブースト 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 は利用しません。
詳しく知っている人がいたら、興味津々です!