По сути, правило состоит в том, что вы не можете перейти в блок после объявления, которое имеет инициализацию (или после объявления переменной типа, отличной от POD). Стандарт C ++ гласит (C ++ 03 §6.7):
Можно передавать в блок, но не так, чтобы обойти объявления с инициализацией. Программа, которая переходит (77) из точки, в которой локальная переменная с автоматическим хранением находится вне области действия, до точки, где она находится в области видимости, плохо сформирована, если переменная не имеет тип POD (3.9) объявляется без инициализатора (8.5).
(*) Переход от условия оператора switch
к метке case
считается скачком в этом отношении.
int newVal = 42;
- это объявление с инициализатором (часть = 42
). Программа некорректна, потому что если val
равно 1
или 2
, вы прыгнете в блок переключателей после инициализации.
int newVal2;
также является декларацией; поскольку int
является типом POD, а объявление не имеет инициализатора, вы можете пропустить это объявление.