Eu encontrei este layout for-loop:
#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;
}
Eu queria saber para que serve essa camada extra de colchetes? Isso aparece algumas vezes em nossa base de código.
Respostas:
Era uma vez, muitas luas atrás, VS6 existia e era popular. No entanto, ele falhou em estar de acordo com vários padrões C ++; o que era razoável na época, pois foi lançado um pouco antes (no mesmo ano) do padrão ser oficialmente lançado; no entanto, aderiu ao rascunho da norma, tanto quanto eu sei.
Um dos padrões que mudou entre o rascunho e o padrão oficial foi o tempo de vida das variáveis de loop for criadas na primeira seção; levando à falha de compilação do código a seguir
porque
i
foi redefinido pelo segundo loop for.Enquanto outros compiladores também sofreram esse bug; Destaco o VS6 porque ele permaneceu a única versão do Visual Studio por vários anos após o lançamento do padrão, mas nunca lançou uma atualização para este problema específico; o que significa que teve um impacto mais significativo.
Uma solução para isso é forçar todo o loop for em seu próprio escopo, como você mostrou.
fonte
{
e}
criará um escopo e, se você definir algumas variáveis no escopo, não poderá acessá-las de fora. Masfor
já crie esse escopo. assimé o mesmo que
mas se você definir algo entre eles, há uma diferença
Neste exemplo,
a
não estará acessível de fora do escopo.fonte
Em seu exemplo particular, não há razão para eles.
Às vezes, você pode querer criar um escopo para uma variável:
No entanto, vejo isso como um antipadrão. Normalmente, se você precisar fazer isso, provavelmente o
for
deve ser uma função própria.fonte
É um escopo de bloco marcado por
{}
colchetes. Geralmente é usado para marcar a área de armazenamento automático . No seu caso, parece não fazer nada, pois o loop for tem seu próprio escopo no C ++ padrão.fonte