Для цикла внутри собственных фигурных скобок

Я столкнулся с этим шаблоном для цикла:

#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;
}

Мне было интересно, для чего нужен этот дополнительный слой брекетов? Это появляется несколько раз в нашей базе кода.

Ответ 1

Когда-то давно, много лун назад, VS6 существовал и был популярен. Однако он не соответствовал ряду C++ стандартов; который был разумным в то время, когда он был выпущен незадолго до (в том же году), стандарт был официально выпущен; насколько мне известно, он, однако, придерживался проекта стандарта.

Одним из стандартов, которые изменились между проектом и официальным стандартом, было время жизни переменных цикла, созданных в первом разделе; приводя к следующему коду, который не удалось скомпилировать

{
    for (int i=0; i<1; ++i){}
    for (int i=0; i<2; ++i){}
}

потому что i был переопределен вторым циклом.

В то время как другие компиляторы также пострадали от этой ошибки; Я выделяю VS6, потому что он оставался единственной версией visual studio в течение нескольких лет после выпуска стандарта, но никогда не выпускал обновление для этой конкретной проблемы; а это означает, что это оказало более существенное влияние.

Решение этого - заставить весь цикл цикла использовать в своей области, как вы показали.

Ответ 2

{ и } создаст область действия, и если вы определите некоторые переменные в области, к которым вы не можете получить доступ извне. Но for уже создать эту сферу. Так

{for(int i = 0; i < count; ++i){}} 

такой же как

for(int i = 0; i < count; ++i){}

но если вы определите что-то между ними, есть разница

{int a = 0; for(int i = 0; i < count; ++i){}}

В этом примере a не будет доступен извне.

Ответ 3

Это область блока, отмеченная {} фигурными скобками. Он обычно используется для обозначения области автоматического хранения. В вашем случае это ничего не делает, поскольку цикл for имеет свою собственную область применения в стандарте C++.

Ответ 4

В вашем конкретном примере нет причин для них.

Иногда вам может понадобиться создать область для переменной:

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

Однако я вижу это анти-шаблон. Обычно, если вы оказываетесь в необходимости делать это, то, скорее всего, for должна быть своя функция.