Range-based for loop (since C++11)
Executes a for loop over a range.
Used as a more readable equivalent to the traditional for loop operating over a range of values, for example, from some container or list.
Contents |
[edit] Syntax
attr(optional) for ( range_declaration : range_expression) loop_statement
|
|||||||||
[edit] Explanation
The above syntax produces code similar to the following (__range
, __begin
and __end
are for exposition only):
{
|
|||||||||
The range_expression is evaluated to determine the sequence or range will be iterated over. Each element of the sequence is dereferenced, and assigned to the variable using the type and name given in the range_declaration.
The begin_expr
and end_expr
are defined to be either:
- If (__range) is an array, then (__range) and (__range + __bound), where
__bound
is the array bound - If (__range) is a class and has either a begin or end member (or both), then
begin_expr
is__range.begin()
andend_expr
is__range.end()
; - Otherwise, begin(__range) and end(__range), which are found based on argument-dependent lookup rules with std as an associated namespace.
If range_expression returns a temporary, its lifetime is extended until the end of the loop, as indicated by binding to the rvalue reference __range
, but beware that temporaries nested inside range_expression do not get extended lifetimes.
Just as with a traditional loop, break statement can be used to exit the loop early and continue statement can be used to restart the loop with the next element.
[edit] Keywords
[edit] Example
#include <iostream> #include <vector> int main() { std::vector<int> v = {0, 1, 2, 3, 4, 5}; for (int &i : v) // access by reference (const allowed) std::cout << i << ' '; std::cout << '\n'; for (auto i : v) // compiler uses type inference to determine the right type std::cout << i << ' '; std::cout << '\n'; for (int i : v) // access by value as well std::cout << i << ' '; std::cout << '\n'; }
Output:
0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5