¿Por qué es a = i + i ++ un comportamiento no definido y no especificado
Leí varias respuestas muy buenas sobre comportamiento indefinido y puntos de secuencia (por ejemplo,Comportamiento indefinido y puntos de secuencia.) y entiendo que
int i = 1;
a = i + i++; //this is undefined behaviour
Es un código indefinido, según el estándar C ++. Pero, ¿cuál es el razonamiento más profundo detrás de su comportamiento indefinido? ¿No sería suficiente hacer que el comportamiento no especificado? El argumento normal es que, al tener pocos puntos de secuencia, los compiladores de C ++ pueden optimizar mejor para diferentes arquitecturas, pero ¿dejarlo sin especificar no permitiría esas optimizaciones también? En
a = foo(bar(1), bar(2)); //this is unspecified behaviour
El compilador también puede optimizar, y no es un comportamiento indefinido. En el primer ejemplo, parece claro que a es 2 o 3, por lo que la semántica me parece clara. Espero que haya un razonamiento, por qué algunas cosas no están especificadas, y otras no están definidas.