Por que é um comportamento = i + i ++ indefinido e não não especificado

Eu li várias respostas muito boas sobre comportamento indefinido e pontos de seqüência (por exemplo,Comportamento indefinido e pontos de sequência) e eu entendo que

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

é um código indefinido, de acordo com o padrão C ++. Mas qual é o raciocínio mais profundo por trás do comportamento indefinido? Não seria suficiente para torná-lo um comportamento não especificado? O argumento normal é que, tendo poucos pontos de sequência, os compiladores de C ++ podem otimizar melhor para arquiteturas diferentes, mas não deixá-lo não especificado permitiria essas otimizações também? Em

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

o compilador também pode otimizar e não é um comportamento indefinido. No primeiro exemplo, parece claro que a é 2 ou 3, então a semântica parece ser clara para mim. Espero que haja um raciocínio, por que algumas coisas não são especificadas e outras são indefinidas.

questionAnswers(5)

yourAnswerToTheQuestion