Orden de evaluación y comportamiento indefinido.

Hablando en el contexto del estándar C ++ 11 (que ya no tiene un concepto de puntos de secuencia, como ya sabe) quiero entender cómo se definen los dos ejemplos más simples.

int i = 0;

i = i++;   // #0

i = ++i;   // #1

Hay dos temas sobre SO que explican esos ejemplos dentro del contexto de C ++ 11.aquí se dijo que#0 invoca a UB y#1 está bien definido.aquí Se dijo que ambos ejemplos no están definidos. Esta ambigüedad me confunde mucho. He leído esto bien estructuradoreferencia Tres veces ya, pero el tema parece ser demasiado complicado para mí.

.

Analicemos el ejemplo#0: i = i++;.

Las citas correspondientes son:

El cálculo del valor de los operadores incorporados de postincremento y postdecrement se secuencia antes de su efecto secundario.

El efecto secundario (modificación del argumento izquierdo) del operador de asignación integrado y de todos los operadores de asignación compuesta integrada se secuencia después del cálculo del valor (pero no los efectos secundarios) de los argumentos izquierdo y derecho, y se secuencia antes el cálculo del valor de la expresión de asignación (es decir, antes de devolver la referencia al objeto modificado)

Si un efecto secundario en un objeto escalar no tiene secuencia en relación con otro efecto secundario en el mismo objeto escalar, el comportamiento no está definido.

A medida que lo entiendo, el efecto secundario del operador de asignación no se secuencia con los efectos secundarios de los argumentos de izquierda y derecha. Por lo tanto, el efecto secundario del operador de asignación no se secuencia con los efectos secundarios dei++. Asi que#0 Invoca una UB.

.

Analicemos el ejemplo#1: i = ++i;.

Las citas correspondientes son:

El efecto secundario de los operadores integrados de preincremento y predecremento se secuencia antes de su cálculo de valor (regla implícita debido a la definición como asignación compuesta)

El efecto secundario (modificación del argumento izquierdo) del operador de asignación integrado y de todos los operadores de asignación compuesta integrada se secuencia después del cálculo del valor (pero no los efectos secundarios) de los argumentos izquierdo y derecho, y se secuencia antes el cálculo del valor de la expresión de asignación (es decir, antes de devolver la referencia al objeto modificado)

Si un efecto secundario en un objeto escalar no tiene secuencia en relación con otro efecto secundario en el mismo objeto escalar, el comportamiento no está definido.

No puedo ver cómo este ejemplo es diferente del#0. Esto parece ser un UB para mí por la misma razón que#0. El efecto secundario de la asignación no se secuencia con el efecto secundario de++i. Parece ser una UB. El tema que me gusta arriba dice que está bien definido. ¿Por qué?

.

Pregunta: ¿cómo puedo aplicar las reglas entre comillas para determinar la UB de los ejemplos? Una explicación lo más simple posible sería muy apreciada. ¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta