Здравствуйте, Аноним, Вы писали:
А>>>Из стандарта, я понял, что вызов функции является sequence point.
А>>Двумя.
А>то есть перед началом вызова и после вызова?
После вычисления аргументов и после копирования возвращаемого значения.
А>>>Если это так, объясните мне, как работает следующий фрагмент кода:
А>>Следующий фрагмент кода не работает.
А>он работает даже если тут UB, просто на всех компиляторах по-разному.
В том числе компилятор может, например, прервать трансляцию с выдачей диагностического сообщения.
А>И ИМХО нет тут никакого UB.
А>operator<< принимает один аргумент код эквивалентен серии вложенных вызовов operator<<
А>откуда здесь возмётся UB?
Уже было сказано, откуда:
А>>Потому, что переменная i модифицируется более одного раза между двумя соседними точками следования.
Давайте по порядку.
f(i++) + f(i++);
Понятно, почему здесь UB?