Por que o C ++ impõe esse comportamento ao cruzar a inicialização? [duplicado]

Digamos que eu tenha algum código c ++:

if (error)
    goto exit;
... 
// size_t i = 0; //error
size_t i;
i = 0;
...
exit:
    ...

Eu entendo que não devemos usargoto, mas ainda por que

size_t i;
i = 0;

compilar enquantosize_t i = 0; não faz?

Por que esse comportamento é imposto pelo padrão (mencionado por @SingerOfTheFall)?

É possível transferir para um bloco, mas não de uma maneira que ignora declarações com inicialização. Um programa que salta de um ponto em que uma variável local com duração de armazenamento automático não está no escopo para um ponto em que está no escopo está malformada, a menos que a variável tenha o tipo POD (3.9) e seja declarada sem um inicializador.

questionAnswers(2)

yourAnswerToTheQuestion