Я наткнулся на этот макет цикла:
#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;
}
Мне было интересно, для чего нужен этот дополнительный слой подтяжек? Это несколько раз появляется в нашей кодовой базе.
Ответы:
Давным-давно, много лун назад, VS6 существовал и был популярен. Однако он не соответствовал ряду стандартов C ++; что было разумным в то время, поскольку он был выпущен незадолго до (в том же году) официального выпуска стандарта; однако, насколько мне известно, он придерживался проекта стандарта.
Одним из стандартов, которые изменились между черновиком и официальным стандартом, было время жизни переменных цикла for, созданных в первом разделе; что приводит к тому, что следующий код не может быть скомпилирован
потому что
i
был переопределен вторым циклом for.В то время как другие компиляторы также страдали этой ошибкой; Я выделяю версию VS6, потому что она оставалась единственной версией Visual Studio в течение нескольких лет после выпуска стандарта, но никогда не выпускала обновления для этой конкретной проблемы; это означает, что это имело более значительное влияние.
Чтобы решить эту проблему, нужно поместить весь цикл for в его собственную область видимости, как вы показали.
источник
{
и}
создаст область, и если вы определите некоторые переменные в области, вы не сможете получить к ним доступ извне. Ноfor
уже создайте этот размах. Тактакой же как
но если вы определите что-то между ними, есть разница
В этом примере
a
недоступен извне.источник
В вашем конкретном примере для них нет причин.
Иногда вам может понадобиться создать область для переменной:
Однако я вижу в этом антипаттерны. Обычно, если вам нужно это сделать, то, скорее всего, это
for
должно быть отдельной функцией.источник
Это область блока, отмеченная
{}
фигурными скобками. Обычно используется для обозначения области автоматического хранения . В вашем случае он, похоже, ничего не делает, поскольку цикл for имеет свою собственную область видимости в стандартном C ++.источник