For loop inside its own curly braces

C++For LoopScope

C++ Problem Overview


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.

C++ Solutions


Solution 1 - C++

Once upon a time, many moons ago, VS6 existed and was popular. It failed however to conform to a number of C++ standards; which was reasonable at the time as it was released just before (on the same year) the standard was officially released; it did however adhere to the draft of the standard as far as I'm aware.

One of the standards that changed between the draft and the official standard, was the lifetime of for loop variables created in the first section; leading to the following code failing to compile

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

because i was redefined by the second for loop.

While other compilers also suffered this bug; I highlight the VS6 one because it remained the only version of visual studio for a number of years after the release of the standard, but never released an update for this particular issue; meaning that it had a more significant impact.

A solution to this is to force the whole for loop into its own scope as you have shown.

Solution 2 - C++

{ and } will create a scope and if you define some variables in the scope you cannot access them from outside. But for already create that scope. So

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

is the same as

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

but if you define something between them, there is a difference

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

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

Solution 3 - C++

It's a block scope marked by {} braces. It is usually used to mark the area of automatic storage. In your case it doesn't seem to do anything as the for loop has its own scope in standard C++.

Solution 4 - C++

In your particular example there is no reason for them.

Sometimes you could want to create a scope for a 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

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEd NormanView Question on Stackoverflow
Solution 1 - C++UKMonkeyView Answer on Stackoverflow
Solution 2 - C++cokcekenView Answer on Stackoverflow
Solution 3 - C++RonView Answer on Stackoverflow
Solution 4 - C++bolovView Answer on Stackoverflow