Por que a operação de deslocamento à esquerda invoca o Comportamento indefinido quando o operando do lado esquerdo tem valor negativo?

Em C, a operação de deslocamento à esquerda em bits chama o comportamento indefinido quando o operando do lado esquerdo tem valor negativo.

Citações relevantes da ISO C99 (6.5.7 / 4)

O resultado de E1 << E2 são as posições de bit E2 com deslocamento à esquerda E1; os bits desocupados são preenchidos com zeros. Se E1 tiver um tipo não assinado, o valor do resultado será E1 × 2E2, módulo reduzido um a mais que o valor máximo representável no tipo de resultado. Se E1 tiver um tipo assinado e um valor não negativo, e E1 × 2E2&nbsp;é representável no tipo de resultado, então esse é o valor resultante; de outra forma,o comportamento é indefinido.

Mas em C ++ o comportamento é bem definido.

ISO C ++ - 03 (5.8 / 2)

O valor de E1 << E2 é E1 (interpretado como um padrão de bits) posições de bits E2 deslocadas à esquerda; bits desocupados são preenchidos com zero. Se E1 tiver um tipo não assinado, o valor do resultado será E1 multiplicado pela quantidade 2 elevada à potência E2, módulo reduzido ULONG_MAX + 1 se E1 tiver um tipo não assinado por muito tempo, UINT_MAX + 1 caso contrário. [Nota: as constantes ULONG_MAX e UINT_MAX são definidas no cabeçalho). ]

Que significa

int a = -1, b=2, c;
c= a << b ;

chama comportamento indefinido em C, mas o comportamento está bem definido em C ++.

O que forçou o comitê ISO C ++ a considerar esse comportamento bem definido em oposição ao comportamento em C?

Por outro lado, o comportamento éimplementation defined&nbsp;para operação de deslocamento à direita bit a bit quando o operando esquerdo é negativo, certo?

Minha pergunta é por que a operação de deslocamento à esquerda invoca o Comportamento indefinido em C e por que o operador de deslocamento à direita invoca apenas o comportamento definido pela implementação?

P.S: Por favor, não dê respostas como "É um comportamento indefinido porque o Padrão diz isso". : P