Нет. Типичный итератор не имеет метода begin
или end
. begin
и end
не вызываются на итераторе, они вызываются на объекте, на который ссылается итератор. *ln
разыменовывает итератор и предоставляет объект, на который ссылается итератор, a Line
в этом случае. (*ln).end()
означает «Получите мне объект Line
на ln
и вызовите для него метод end
». Что бы Line
ни было, должно иметь begin
и end
методы, иначе компилятор поймает ошибку.
Проходя по логике c, мы получим
++pos; // advance iterator one character in the current Line
if (pos==(*ln).end()) { // if this character is the the `Line`'s end iterator
// we need a new line
{
++ln; // advance to the next line
pos = (*ln).begin(); // referenced character is first character in next line
}
return *this;
Это позволяет пользователь может перебирать документ по буквам, не осознавая, что они фактически пересекают строки, что позволяет писателю использовать уже существующий код для прохождения строк в документе и символов в строке. Практически никакой новый код не написан для того, что в противном случае могло бы быть сложной задачей.