Hi,

The loops we have in c++ are loop while, for and do...while. How they work is pretty know, but I will describe them shortly (in their general use) to better demonstrate my proposal.

1. while: (condition evaluation before statements)
    step1: Evaluate condition. Continue to step2 if the condition is true
    step2: Execute statements
    step3:  return to step1

2. do: (condition evaluation after statements)
    step1: Execute statements
    step2: Evaluate condition. Return to srep1 if the condition is true

3. for: (condition evaluation before statements)
    step1: create a counter
    step2: Evaluate condition. Continue to step3 if the condition is true
    step3: Execute statements
    step4: Execute an mathematics operation (with the counter) and return to step2

What I see is we have a lack type of loop where is similar to for but with the condition after statements as the do...while loop).
The proposal is to include a new loop that marge the for and do..while following the pattern below:

dofor loop:
         step1: create a counter
         step2: execute statements
         step3: Execute a mathematics operation (with the counter)
         step4: return to step2 if condition is true

The syntax could be similar to for like that:

dofor ( <variable declaration>; <mathematics operation>; <condition evaluation>) {
         statements...
}

Just for example, I wrote a templated functionn to print the index of an array's elements:

//1. While
      template <typename obj, size_t S, enable_if_t <S != 0, size_t> = 1>
      void WhileDescending(const array<obj, S>& Obj) {
             size_t Size = Obj.size();
             while (Size) {
                      --Size;
                      cout << Size;
             }
      }
//----------------------------------------------------------------------------------------------------------------
//2. do
      template <typename obj, size_t S, enable_if_t <S != 0, size_t> = 1>
      void DoDescending(const array<obj, S>& Obj) {
             size_t Size = Obj.size();
             do {
                  --Size;
                  cout << Size;
             } while (Size);
      }
//----------------------------------------------------------------------------------------------------------------
//3. for
      template <typename obj, size_t S, enable_if_t <S != 0, size_t> = 1>
      void ForDescending(const array<obj, S>& Obj) {
             for (size_t Size = Obj.size() - 1; Size != numeric_limits<size_t>::max(); --Size)
                  cout << Size;
      }
//----------------------------------------------------------------------------------------------------------------
//The proposal 'dofor'
         template <typename obj, size_t S, enable_if_t <S != 0, size_t> = 1>
         void DoForDescending(const array<obj, S>& Obj) {
                dofor (size_t Size = Obj.size(); --Size; Size >= 0)
                         cout << Size;
         }

Best regards,
M.Rosemberg