Switch-Case: объявление с инициализацией и объявление и затем назначение - PullRequest
6 голосов
/ 21 сентября 2010

В операторах switch-case объявление с инициализацией недопустимо, но объявление и затем назначение разрешено. Как показано в следующем фрагменте кода.

В чем разница между этими двумя типами инициализации со стороны компилятора? И почему первый тип инициализации недействителен, а второй тип допустим.

switch(val)  
{  
case 0:  
  int newVal = 42;  //Invalid
  break;
case 1:  
  int newVal2;      //Valid
  newVal2 = 42;  
  break;
case 2:
  break;
}

Ответы [ 2 ]

10 голосов
/ 21 сентября 2010

По сути, правило состоит в том, что вы не можете перейти в блок после объявления, которое имеет инициализацию (или после объявления переменной типа, отличной от 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, а объявление не имеет инициализатора, вы можете пропустить это объявление.

5 голосов
/ 21 сентября 2010

На самом деле, ни один из них не является законным C ++. Вы не можете объявить переменную в случае переключения, если она не ограничена областью действия:

switch(val)  
{  
case 0:  
  {
    int newVal = 42;  // now valid
  }
  break;
case 1:  
  {
    int newVal2;      // still Valid
    newVal2 = 42;  
  }
  break;
case 2:
  break;
}

Тот факт, что ваш компилятор допускает случай 1, является дефектом вашего компилятора или, возможно, расширением. По крайней мере, согласно стандарту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...