为什么可以在for-statement中重新分配引用const?

时间:2015-10-23 07:53:11

标签: c++

我是C ++的新手,我对此感到困惑:

vector<int> v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1];  // compiler will show error.

我知道无法重新分配引用const r1。但请看下面的代码:

for (const int &r2 : v) cout << r2;

为什么不会出错?引用const r2被分配两次,对吗?

3 个答案:

答案 0 :(得分:35)

不,它没有被分配两次。 r2从迭代开始(循环体上的一个循环)存在,直到迭代结束。下一次迭代中的r2是同名的另一个对象。每次迭代都有自己的r2,并且每个迭代都是单独初始化的。

答案 1 :(得分:24)

根据C ++ 11标准 [stmt.ranged]

for (const int &r2 : v) std::cout << r2;

其中¹vvector,相当于:

{
    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

  

引用const r2被分配两次,对吗?

没有。每次迭代都有一个 new r2变量。

¹基于for的范围也可以与其他类型的集合一起使用,包括原始数组。这里给出的等价是std::vector的一般等价。 功能

答案 2 :(得分:6)

基于范围的for如下所示:

  

attr(可选)for(range_declaration:range_expression)loop_statement

其中 range_declaration

  

range_declaration - 命名变量的声明,其类型是range_expression表示的序列元素的类型,或对该类型的引用。经常使用auto说明符进行自动类型扣除

因此,每次迭代都会引入一个新的声明,该引用只存在于下一个循环迭代之前。