For loop inside its own curly braces

I have come across this for-loop layout:

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

I was wondering what this extra layer of braces is for? This appears a few times in our code base.

9468 次浏览

这是 block scope,用 {}支架标记。它通常用来标记 自动存储器自动存储器的面积。在您的例子中,它似乎没有做任何事情,因为 循环在标准 C + + 中有自己的作用域。

{}将创建一个范围,如果您在该范围中定义了一些变量,则不能从外部访问它们。但是 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){}}

In this example, a won't be accessible from outside scope.

在您的特殊例子中,没有理由使用它们。

有时候,您可能希望为变量创建一个作用域:

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

However I see this an anti-pattern. Usually if you find yourself in need of doing this then most likely the for should be its own function.

很久很久以前,也就是很久以前,VS6存在并且很流行。然而,它并没有遵循一些 C + + 标准; 这在当时是合理的,因为它是在标准正式发布之前(在同一年)发布的; 然而,据我所知,它确实遵循了标准的草案。

在草案和官方标准之间发生变化的标准之一是在第一部分中创建的 for 循环变量的生命周期; 这导致以下代码无法编译

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

because i was redefined by the second for loop.

当其他编译器也遇到这个问题时,我强调了 VS6,因为在标准发布之后的很多年里,它仍然是 Visual Studio 的唯一版本,但是从来没有为这个特殊的问题发布过更新; 这意味着它有更重要的影响。

解决这个问题的一个方法是强制整个 for 循环进入它自己的作用域,如您所示。