J'ai rencontré cette disposition pour la boucle:
#include <iostream>
int main()
{
{
for (int i = 0; i != 10; ++i)
{
std::cout << "delete i->second;" << std::endl;
}
}
{
for (size_t i = 0; i < 20; ++i)
{
std::cout << "delete m_indices[i];" << std::endl;
}
}
return 0;
}
Je me demandais à quoi sert cette couche supplémentaire d'accolades? Cela apparaît quelques fois dans notre base de code.
Il était une fois, il y a de nombreuses lunes, VS6 existait et était populaire. Il n'a cependant pas été conforme à un certain nombre de normes C++. ce qui était raisonnable à l'époque car il a été publié juste avant (la même année), la norme a été officiellement publiée; elle a toutefois été conforme au projet de norme, à ma connaissance.
L'une des normes qui a changé entre le projet et le standard officiel était la durée de vie des variables de boucle for créées dans la première section; conduisant à l'échec de la compilation du code suivant
{
for (int i=0; i<1; ++i){}
for (int i=0; i<2; ++i){}
}
parce que i
a été redéfini par la seconde pour la boucle.
Alors que d'autres compilateurs ont également souffert de ce bug; Je souligne la version VS6 car elle est restée la seule version de visual studio pendant plusieurs années après la publication de la norme, mais n’a jamais publié de mise à jour pour ce problème particulier; ce qui signifie qu'il a eu un impact plus significatif.
Une solution consiste à forcer l'ensemble de la boucle for dans son propre champ d'application, comme vous l'avez montré.
{
et }
créeront une étendue et si vous définissez des variables dans l'étendue, vous ne pourrez pas y accéder de l'extérieur. Mais for
crée déjà cette portée. Alors
{for(int i = 0; i < count; ++i){}}
est le même que
for(int i = 0; i < count; ++i){}
mais si vous définissez quelque chose entre eux, il y a une différence
{int a = 0; for(int i = 0; i < count; ++i){}}
Dans cet exemple, a
ne sera pas accessible de l'extérieur.
C'est un portée du bloc marqué par {}
accolades. Il est généralement utilisé pour marquer la zone stockage automatique . Dans votre cas, il ne semble rien faire car la boucle pour la boucle a sa propre portée en C++ standard.
Dans votre exemple particulier, il n'y a aucune raison pour cela.
Parfois, vous voudrez peut-être créer une portée pour une variable:
float average;
// ...
{
int sum = 0;
for (int i = 0; i < count; ++i)
{
sum += v[i];
}
average = (float)sum / count;
}
// use average
// sum not in scope here
Cependant, je vois cela comme un anti-modèle. Habituellement, si vous avez besoin de le faire, il est fort probable que la for
devrait être sa propre fonction.