Ответ 1
У вас есть поведение undefined, потому что ваши операции находятся между двумя последовательными точками последовательности (нет точек последовательности между оценкой аргументов функции). Вы можете свободно воспринимать точки последовательности как "временные" маркеры и между двумя последовательными, вам не разрешается изменять одну и ту же переменную более одного раза.
В основном ваш код эквивалентен
std::cout << x << x++; // undefined behaviour
поскольку y
является просто ссылкой (псевдоним) для x
.
1.9 Выполнение программы [intro.execution] (подчеркните мое)
14) Каждое вычисление значения и , связанное с полное выражение секвенируется перед каждым вычислением значения и стороной эффект, связанный со следующим полным выражением, которое должно быть оценено.
15) За исключением тех случаев, когда отмечено, оценки операндов отдельных операторы и подвыражения отдельных выражений unsequenced. [Примечание: в выражении, которое оценивается более одного раза во время выполнения программы, без последствий и неопределенно необязательные оценки его подвыражений не должны выполняться последовательно в разных оценках. - конечная нота] Значение вычисления операндов оператора секвенированы до вычисление значения результата оператора. Если побочный эффект на скалярный объект не зависит от другого побочного эффекта один и тот же скалярный объект или вычисление значения, используя значение один и тот же скалярный объект, и они не являются потенциально параллельными (1.10), поведение undefined. [Примечание. В следующем разделе применяются аналогичные, но более сложные ограничения на потенциально параллельные вычисления. -endnote]
При вызове функции (независимо от того, является ли функция встроенной), каждый вычисление значения и побочный эффект, связанный с любым аргументом выражение или выражение postfix, обозначающее вызываемый функция, секвенируется перед выполнением каждого выражения или утверждение в теле вызываемой функции. [Примечание: значение вычисления и побочные эффекты, связанные с различными аргументами выражения не подвержены влиянию. - конечная нота] Каждая оценка в вызывающая функция (включая другие вызовы функций), которая не является в противном случае, в определенной последовательности, до или после выполнения тело вызываемой функции неопределенно упорядочено с учетом к выполнению вызываемой функции .9 Несколько контекстов в С++ вызывают оценку вызова функции, даже если соответствующая синтаксис вызова функции появляется в блоке перевода. [ Пример: Оценка нового выражения вызывает одно или несколько распределений и конструкторские функции; см. 5.3.4. В другом примере, вызов функция преобразования (12.3.2) может возникать в контекстах, в которых нет синтаксис вызова функции.
Связанный: fooobar.com/info/59242/...