为什么可以在for语句中重新分配引用常量? 我是C++新手,我对此感到困惑: vector<int> v = { 1,2 }; const int &r1 = v[0]; //r1 = v[1]; // compiler will show error.

为什么可以在for语句中重新分配引用常量? 我是C++新手,我对此感到困惑: vector<int> v = { 1,2 }; const int &r1 = v[0]; //r1 = v[1]; // compiler will show error.,c++,C++,为什么不会出错呢?参考常数r2分配了两次,对吗?不,它没有分配两次r2从迭代开始(循环体上的一轮)一直存在到迭代结束r2是另一个同名的对象。每个迭代都有自己的r2,并且每个迭代都单独初始化。基于范围的for如下所示: attr(可选)for(范围声明:范围表达式)循环语句 范围_声明在哪里 range_声明-命名变量的声明,其类型是range_表达式表示的序列元素的类型,或对该类型的引用。通常使用自动说明符进行自动类型推断 因此每次迭代都会引入一个新的声明,引用只存在到下一个循环迭代。根据C++

为什么不会出错呢?参考常数r2分配了两次,对吗?

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

基于范围的
for
如下所示:

attr(可选)for(范围声明:范围表达式)循环语句

范围_声明在哪里

range_声明-命名变量的声明,其类型是range_表达式表示的序列元素的类型,或对该类型的引用。通常使用自动说明符进行自动类型推断


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

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

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

参考常数r2分配了两次,对吗

否。在每次迭代中都有一个新的
r2
变量


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

它被分配给v[0],然后又分配给v[1],不是吗?为什么
被分配给(int k=0;k<2;k++){const int&r1=v[k];}
允许?@immibis我读到它的时候就好像它是一个,并且被启发了一样但是,
r2
是一个常数。我读的那本书说,
r2
是一个低级常量,它的值是不能更改的。“我说得对吗?”荀春龙在评论之前请仔细阅读答案。答案已针对您的评论。:)@哦,我明白了。一次迭代意味着一个循环。我把它误认为是一个声明。这很有帮助。对不起,我的英语很差,谢谢你!
for (const int &r2 : v) std::cout << r2;
{
    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;
    }
}