Search code examples
c++algorithmfor-loopvariablesconstants

How to make a for loop variable const with the exception of the increment statement?


Consider a standard for loop:

for (int i = 0; i < 10; ++i) 
{
   // do something with i
}

I want to prevent the variable i from being modified in the body of the for loop.

However, I cannot declare i as const as this makes the increment statement invalid. Is there a way to make i a const variable outside of the increment statement?


Solution

  • From c++20, you can use ranges::views::iota like this:

    for (int const i : std::views::iota(0, 10))
    {
       std::cout << i << " ";  // ok
       i = 42;                 // error
    }
    

    Here's a demo.


    From c++11, you can also use the following technique, which uses an IIILE (immediately invoked inline lambda expression):

    int x = 0;
    for (int i = 0; i < 10; ++i) [&,i] {
        std::cout << i << " ";  // ok, i is readable
        i = 42;                 // error, i is captured by non-mutable copy
        x++;                    // ok, x is captured by mutable reference
    }();     // IIILE
    

    Here's a demo.

    Note that [&,i] means that i is captured by non-mutable copy, and everything else is captured by mutable reference. The (); at the end of the loop simply means that the lambda is invoked immediately.