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対応は無理かもしれません。