Warum ist a = i + i ++ undefiniert und nicht spezifiziertes Verhalten?

Ich habe einige sehr gute Antworten über undefiniertes Verhalten und Sequenzpunkte gelesen (z.Undefiniertes Verhalten und Sequenzpunkte) und ich verstehe, dass

   int i = 1;
   a = i + i++; //this is undefined behaviour

ist undefinierter Code gemäß dem C ++ - Standard. Aber was ist die tiefere Begründung dafür, dass es sich um undefiniertes Verhalten handelt? Wäre es nicht genug, um es unspezifisch zu machen? Das normale Argument ist, dass C ++ - Compiler mit wenigen Sequenzpunkten besser für verschiedene Architekturen optimieren können, aber nicht auch diese Optimierungen zulassen, wenn sie nicht angegeben werden? Im

   a = foo(bar(1), bar(2)); //this is unspecified behaviour

Der Compiler kann auch optimieren, und es ist kein undefiniertes Verhalten. Im ersten Beispiel scheint es klar zu sein, dass a entweder 2 oder 3 ist, daher scheint mir die Semantik klar zu sein. Ich hoffe, es gibt eine Begründung, warum einige Dinge nicht spezifiziert sind und andere undefiniert.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage