これって合法?

 template <typename Fwd>
 void foo(Fwd first, Fwd last);

 template <typename Fwd>
 void foo_dispatch(Fwd first, Fwd last)
  { foo(&*first, &*last); } // ← &*last は合法?

 ただし、Fwd はアドレスが連続する要素を指す forward iterator で、
 last は何らかの有効な領域の終端( 要するに [first, last) )であるとする。

*last を読み書きするのは当然ダメなんだけど、
&*last でアドレスだけ取得するのはOKなのかな。
それとも、&*last のうち *last の時点で違法な参照外しになる?