Операторы доступа к членам

Задания раздела 4.6
4.20. С учетом того, что iter имеет тип vector<string>::iterator, укажите, какие из следующих выражений допустимы, если таковые имеются. Объясните поведение допустимых выражений, и почему ошибочные не допустимы?
(a) *iter++;
(b) (*iter)++;
(c) *iter.empty
(d) iter->empty();
(e) ++*iter;
(f) iter++->empty();

Оператор обращения к значению имеет приоритет ниже, чем оператор точка. Поэтому обращение к значению всегда огораживают во избежание.

4.20. С учетом того, что iter имеет тип vector<string>::iterator, укажите, какие из следующих выражений допустимы, если таковые имеются. Объясните поведение допустимых выражений, и почему ошибочные не допустимы?
(a) *iter++; /* обращаюсь к текущему значению, а потом перевожу итератор на следующий элемент после текущего, на который указывает iter  */
(b) (*iter)++; /*  ошибка, пытаемся увеличить значение, на которое указывает iter, на 1, которое есть строка */
(c) *iter.empty() // ошибка, итератор iter не имеет функции-члена empty()
(d) iter->empty(); // здесь все нормально, потому что iter-> заменяет (*iter).
(e) ++*iter; /* ошибка. потому что применить оператор инкремента к значению нельзя, другое дело *++iter */
(f) iter++->empty(); /* так как выражение эквивалентно (*iter++)->empty(), считаю запись допустимой */
++ можно применять к итератору, но нельзя к значению.
Программа для проверки:
#include <iostream>
#include <vector>
int main()
{
std::vector<std::string> v(10, "hi!");
auto pbeg=v.begin();
while (pbeg!=v.end() && !pbeg->empty())
std::cout << *pbeg++ << std::endl;
return(0);
}

Добавить комментарий