Я прочитал несколько очень хороших ответов о поведении и точках последовательности undefined (например, Undefined поведение и точки последовательности), и я понимаю, что
int i = 1;
a = i + i++; //this is undefined behaviour
- это код undefined, в соответствии со стандартом С++. Но каково более глубокое рассуждение о том, что это поведение undefined? Разве этого было бы недостаточно, чтобы сделать это неуказанным поведением? Нормальный аргумент состоит в том, что, имея несколько точек последовательности, компиляторы С++ могут лучше оптимизироваться для разных архитектур, но не оставляя его неуказанным, позволяют эти оптимизации также? В
a = foo(bar(1), bar(2)); //this is unspecified behaviour
компилятор также может оптимизировать, и это не поведение undefined. В первом примере кажется ясным, что a является либо 2, либо 3, поэтому семантика кажется мне понятной. Я надеюсь, что есть рассуждение, почему некоторые вещи неуточнены, а другие - undefined.