Why reference const can be re-assigned in for-statement?

后端 未结 3 1214
夕颜
夕颜 2021-01-07 16:54

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.
         


        
相关标签:
3条回答
  • 2021-01-07 17:17

    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.

    0 讨论(0)
  • 2021-01-07 17:19

    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.

    0 讨论(0)
  • 2021-01-07 17:27

    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.

    0 讨论(0)
提交回复
热议问题