我是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
被分配两次,对吗?
答案 0 :(得分:35)
不,它没有被分配两次。 r2
从迭代开始(循环体上的一个循环)存在,直到迭代结束。下一次迭代中的r2
是同名的另一个对象。每次迭代都有自己的r2
,并且每个迭代都是单独初始化的。
答案 1 :(得分:24)
根据C ++ 11标准 [stmt.ranged] :
for (const int &r2 : v) std::cout << r2;
其中¹v
是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;
}
}
引用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说明符进行自动类型扣除
因此,每次迭代都会引入一个新的声明,该引用只存在于下一个循环迭代之前。