I\'m new to C++, and I\'m confused about this:
vector v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1]; // compiler will show error.
The ranged-based for
looks like this:
attr(optional) for ( range_declaration : range_expression ) loop_statement
where range_declaration is
range_declaration - a declaration of a named variable, whose type is the type of the element of the sequence represented by range_expression, or a reference to that type. Often uses the auto specifier for automatic type deduction
So each iteration a new declaration is introduced, the reference only exists until the next loop iteration.
No it's not assigned twice. r2
exists from the start of the iteration (a single round over the loop body) until the end of the iteration. r2
in the next iteration is another object by the same name. Each iteration has their own r2
and each of them is initialized separately.
According to the C++11 standard [stmt.ranged]:
for (const int &r2 : v) std::cout << r2;
where ¹v
is a vector
, is equivalent to:
{
auto && __range = (v);
for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin)
{
const int &r2 = *__begin; // <-- new variable in each iteration
std::cout << r2;
}
}
Demo
The reference const
r2
is assigned twice, right?
No. There is a new r2
variable in each iteration.
¹ The range based for
can also be used with other kinds of collections, including raw arrays. The equivalence given here is what the general equivalence becomes for a std::vector
.