Warum erzwingt C ++ ein solches Verhalten bei der Kreuzinitialisierung? [Duplikat]

Nehmen wir an, ich habe etwas C ++ - Code:

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

Ich verstehe, wir sollten nicht verwendengoto, aber immer noch warum

size_t i;
i = 0;

kompilieren währendsize_t i = 0; nicht?

Warum wird ein solches Verhalten vom Standard erzwungen (von @SingerOfTheFall erwähnt)?

Es ist möglich, in einen Block zu übertragen, jedoch nicht so, dass Deklarationen bei der Initialisierung umgangen werden. Ein Programm, das von einem Punkt, an dem eine lokale Variable mit automatischer Speicherdauer nicht im Gültigkeitsbereich ist, zu einem Punkt springt, an dem sie im Gültigkeitsbereich ist, ist fehlerhaft, es sei denn, die Variable hat den POD-Typ (3.9) und wird ohne Initialisierer deklariert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage