The problem is that while in most cases, separating getting theelement referred to by the iterator (or the front of the range) separately from iterating is more efficient than having the iterator return an element whenyou iterate it
Yes, but iterators don't need that separation at all. AFAIK, that's how iterators work in Java and C++. In C# it's MoveNext() and Current, but MoveNext() also checks for emptiness.