¿Por qué C ++ impone tal comportamiento en la inicialización de cruces? [duplicar]

Digamos que tengo un código c ++:

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

Entiendo que no debemos usargoto, pero aun así porque

size_t i;
i = 0;

compilar mientrassize_t i = 0; no?

¿Por qué tal comportamiento es impuesto por la norma (mencionado por @SingerOfTheFall)?

Es posible transferir a un bloque, pero no de una manera que evite las declaraciones con la inicialización. Un programa que salta desde un punto donde una variable local con duración de almacenamiento automático no está dentro del alcance hasta un punto donde está dentro del alcance, está mal formado a menos que la variable tenga un tipo de POD (3.9) y se declare sin un inicializador.

Respuestas a la pregunta(2)

Su respuesta a la pregunta