operator_arrow_proxy
first_iteratorのドキュメントを書いていて、referenceが参照でない場合、pointerはどうなるんだろうと思って調べてみました。
pointerが必要になるのは、operator->()だけですが、
template<class T> struct operator_arrow_proxy { operator_arrow_proxy(const T& x) : value(x) { } const T* operator->() const { return &value; } T value; };
こんな感じのプロキシクラスを返してくれるんですね。なるほど。
あと、first_iteratorですが、volatileが混ざると駄目っぽいです。
一般的な、hoge::hoge(const hoge&)のようなコピーコンストラクタすら呼べないので、あちこちでコンパイルエラーになりました。
volatile対応は無理かもしれません。