我是C++的新手,对以下内容感到困惑:
vector<int> v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1]; // compiler will show error.
我知道引用常量r1
不能被重新赋值。但是请看下面的代码:
for (const int &r2 : v) cout << r2;
为什么那不会出错?常量引用 r2
被赋值了两次,对吗?
我是C++的新手,对以下内容感到困惑:
vector<int> v = { 1,2 };
const int &r1 = v[0];
//r1 = v[1]; // compiler will show error.
我知道引用常量r1
不能被重新赋值。但是请看下面的代码:
for (const int &r2 : v) cout << r2;
为什么那不会出错?常量引用 r2
被赋值了两次,对吗?
不,它没有被分配两次。r2
存在于迭代的开始(循环体的单个轮回)直到迭代结束。下一次迭代中的r2
是另一个同名对象。每次迭代都有自己的r2
,并且它们各自被单独初始化。
r2
是一个常量。我读的书说 r2
是一个低级别的常量,其值不能被改变。我的理解正确吗? - Xun Chenlongfor (const int &r2 : v) std::cout << r2;
其中 ¹v
是一个向量,等价于:
{
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;
}
}
参考常量
r2
被分配了两次,对吗?
不是的。每次迭代都会有一个新的r2
变量。
¹ 基于范围的for
循环也可以用于其他类型的集合,包括原始数组。这里给出的等价性是std::vector
的通用等价性。
基于范围的 for
如下所示:
attr(可选)for( range_declaration : range_expression )loop_statement
其中 range_declaration 是
range_declaration - 命名变量的声明,其类型为 range_expression 所表示的序列元素的类型,或者是该类型的引用。通常使用自动推导的 auto 限定符。
因此,在每次迭代中都会引入新的声明,该引用仅存在于下一次循环迭代之前。
for(int k = 0; k < 2; k++) {const int &r1 = v[k];}
这段代码? - user253751