Dlaczego a = i + i ++ nieokreślone i nieokreślone zachowanie

Przeczytałem kilka bardzo dobrych odpowiedzi na temat niezdefiniowanego zachowania i punktów sekwencji (np.Niezdefiniowane zachowanie i punkty sekwencji) i rozumiem to

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

jest niezdefiniowanym kodem, zgodnie ze standardem C ++. Ale jakie jest głębsze uzasadnienie tego, że jest to niezdefiniowane zachowanie? Czy nie wystarczyłoby, aby uczynić to nieokreślonym zachowaniem? Normalnym argumentem jest to, że mając kilka punktów sekwencji, kompilatory C ++ mogą zoptymalizować lepiej dla różnych architektur, ale nie pozostawiając jej nieokreślonej, również dla tych optymalizacji? W

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

kompilator może również optymalizować i nie jest to niezdefiniowane zachowanie. W pierwszym przykładzie wydaje się jasne, że a jest albo 2 albo 3, więc semantyka wydaje się być dla mnie jasna. Mam nadzieję, że istnieje uzasadnienie, dlaczego niektóre rzeczy są nieokreślone, a inne nieokreślone.

questionAnswers(5)

yourAnswerToTheQuestion