The distinction between a for loop and a range-based for loop is essentially equivalent to the one between goto and a for loop.
The first is a more broad control flow, whereas the second is more organised.
Every range-based loop can be expressed as a for loop, and every for loop can be expressed as a goto.
However, the opposite is not true.
Goto encapsulates the concept of venturing somewhere.
The concept of repeating is encapsulated by the term loop (which involves jumping back).
The concept of iterating across a range from start to finish is encapsulated in a range-based loop (which involves repetition).
If you want to iterate over a whole range, a range-based loop is usually more syntactically straightforward and easier to grasp than a for loop.
A for loop is also easier to grasp than a goto loop.
This is what distinguishes the structured approach.
Consider the following examples and decide which one is easiest to understand:
for (auto it = list.begin(), end = list.end(); it != end; ++it) {
auto& element = *it;
// do stuff with element
}
for (auto& element : list) {
// do stuff with element
}
A range-based loop can loop through an entire range.
A for loop may achieve the same thing.
A for loop, on the other hand, may do much more: it can iterate indices, iterate forever, iterate until a terminator, and so on.