Является iter++->empty()
юридическое выражение?
iter
является iterator
из vector
из string
s.
Я спрашиваю, потому что с учетом приоритета операторов как ->
а также ()
должен предшествовать приращению постфикса, но я действительно не знаю, как операнды должны быть сгруппированы.
На моем компиляторе это работает (выражение дает empty()
результат для первой строки и iter
указывает на вторую строку), но я все еще задаюсь вопросом, является ли это неопределенным поведением.
редактировать
Я только что нашел решение (я думаю):
iter++->empty()
должен быть таким же, как (*iter++).empty()
поэтому с учетом правил ассоциативности и приоритета группировка должна быть:
(((*(iter++)).empty) ())
Это верно?
Это законно, но не делай этого.
Задавать себе этот вопрос является достаточной причиной, чтобы разбить его на два утверждения:
iter->empty();
iter++;
Принимая итератор it
действительно, выражение it++->empty()
четко определен
При условии, что iter->empty()
является верным утверждением, ответ — да. Оператор постинкремента не меняет тип iter
просто увеличивает его после empty()
Метод был выполнен.
Тем не менее, я бы рекомендовал разделить его на два оператора, так как (особенно пост-) операторы инкремента часто делают ваш код менее понятным. Так почему бы не пойти на:
iter->empty();
iter++;