operator++()が呼ばれるたびに、毎回範囲内かどうかテストするってことか?
あんまりうれしい処理じゃないな。

++it;
if (it == li.end()) throw XXX;
とでも書けばいいんじゃないの。