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

Xun*_*ong 30 c++

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

vector<int> v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1];  // compiler will show error.
Run Code Online (Sandbox Code Playgroud)

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

for (const int &r2 : v) cout << r2;
Run Code Online (Sandbox Code Playgroud)

为什么不会出错?参考const r2分配了两次,对吧?

eer*_*ika 35

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

  • @hvd哦,我明白了.一次迭代意味着一个循环.我把它误认为是整个声明.它有助于.抱歉我的英语不好,谢谢! (7认同)

ser*_*gej 24

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

for (const int &r2 : v) std::cout << r2;
Run Code Online (Sandbox Code Playgroud)

其中¹ v是a vector,相当于:

{
    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

参考const r2分配了两次,对吧?

不.每次迭代都有一个 r2变量.


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


Sin*_*all 6

基于范围的for看起来像这样:

attr(可选)用于(range_declaration:range_expression)loop_statement

其中range_declaration

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

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