“les croix de l'initialisation de la variable” seulement lorsque l'initialisation est combiné avec de la déclaration de

J'ai lu cette question sur le "saut de cas étiquette" erreur, mais j'ai encore quelques questions. J'utilise g++ 4.7 sur Ubuntu 12.04.

Ce code donne une erreur:

int main() {
  int foo = 1;
  switch(foo) {
  case 1:
    int i = 0;
    i++;
    break;
  case 2:
    i++;
    break;
  }
}

L'erreur est

jump-to-case-label.cpp: In function int main()’:
jump-to-case-label.cpp:8:8: error: jump to case label [-fpermissive]
jump-to-case-label.cpp:5:9: error:   crosses initialization of int i

Toutefois, ce code compile fine,

int main() {
  int foo = 1;
  switch(foo) {
  case 1:
    int i;
    i = 0;
    i++;
    break;
  case 2:
    i++;
    break;
  }
}

Est le deuxième code, moins dangereux que le premier? Je suis confus quant à pourquoi g++ permet.

Deuxièmement, le correctif de ce problème est à la portée de la variable initialisée. Si le initialisé la variable est un objet de grande taille, et l'instruction switch est dans une boucle while, ne sera pas le constructeur et le destructeur sera appelée à chaque fois que le champ d'application est entré et de gauche, provoquant une diminution de l'efficacité? Ou va le compilateur d'optimiser cette suite?

Je ne comprends pas pourquoi cette compile. Si vous allez directement à la case 2 de votre i n'a pas encore été déclaré!
(Le "secondaire" message d'erreur semble plus pertinente à la question.)
Pourrait le downvoter veuillez expliquer leur downvote?
Pourquoi pensez-vous i n'a pas été déclarée? Il est clairement défini dans le bloc sur la ligne après le case 1: étiquette. Le break consolidés ne pas comme par magie diviser le bloc dans des champs d'application différents. Il n'aurait pas de sens de le faire, car ils peuvent être conditionnelle exécutée que si le programmeur choisit de le faire.

OriginalL'auteur gsingh2011 | 2012-10-20