Метка регистра работает как цель оператора goto
.
Стандарт C ++ содержит: [stmt.dcl]/3
:
Можно передать в блок, но не так, чтобы обойти объявления с инициализацией .
Таким образом, приведенное ниже не удастся:
case 'a':
int x = 4; //will fail
тогда как следующее не подведет:
case 'a':
int x; // this is ok
x = 4;
В ответ на редактирование ОП:
В этом конкретном случае только объявление делает x
видимым по всему выражению switch
, поскольку вокруг него нет фигурных скобок {}
.
Так что x
можно использовать и с другими case
, хотя компилятор предупредит об их использовании неинициализированным. Обратите внимание, что чтение неинициализированной переменной является неопределенным поведением.
Чтобы ответить на последнюю часть вашего вопроса:
Предположим, что объявление с инициализацией было разрешено, это означало бы, что это конкретное значение x
(в данном случае 4) должно использоваться и в других case
s.
Тогда казалось бы, что код для нескольких случаев был выполнен. Так что это не разрешено.