В упражнении 4.20 из C++ Primer, 5e задается вопрос, допустимо ли выражение iter++->empty();
. Предположим, что iter
является vector<string>::iterator
.
Это выражение является законным. Я скомпилировал его с помощью gcc, и ответы на еще один вопрос о переполнении стека обращался к этому много. Однако я не понимаю, почему это законно.
Этот ответ на аналогичный вопрос дает следующее как эквивалентную пару выражений:
iter->empty();
iter++;
В таблице приоритетов операторов в моей книге указано, что ->
имеет более высокий приоритет, чем постфиксный оператор ++
. Это соответствует явному порядку операций в эквивалентном коде выше. Однако я привык видеть, что операторы применяются ко всему, что находится рядом с ними. В случае с ->
я ожидал, что компилятор применит его к ++
(сам по себе, без iter
) и выдаст ошибку. Другими словами, я попытался заключить исходное выражение в скобки как iter(++->empty());
, что явно недопустимо.
Итак, похоже, что С++ требует от компиляторов более сложного разбора выражений, чем просто заключение в скобки на основе приоритета и ассоциативности. Это правильно? Если есть простой способ объяснить, как это происходит на самом деле, я хотел бы знать об этом.
iter
откуда? - person πάντα ῥεῖ   schedule 29.12.2020iter++
должен выполнить привязку первым. Кроме того, ваша книга неверна, или вы неправильно ее читаете; постфикс++
имеет тот же приоритет, что и->
( префикс++
имеет более низкий приоритет, чем любой из них, но здесь он не задействован). - person ShadowRanger   schedule 29.12.2020iter
должно быть увеличено до вызоваempty
. Новички часто путаются в том, когда возникают побочные эффекты до и после инкремента. - person john   schedule 29.12.2020auto temp = iter; iter++; temp->empty();
- person john   schedule 29.12.2020