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
r2is 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.