为什么可以在 for 语句中重新分配引用常量
Why reference const can be re-assigned in for-statement?
我是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
并且每个迭代都是单独初始化的。
根据 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;
}
}
演示
引用常量
r2
被分配了两次,对吧?
不。每次迭代中都有一个新的r2
变量。
¹ 基于范围的for
还可以与其他类型的集合一起使用,包括原始数组。这里给出的等价就是std::vector
的一般等价。
基于范围的for
如下所示:
( range_declaration : range_expression ( 的 attr(可选( loop_statement
range_declaration在哪里
range_declaration - 命名变量的声明,其类型是 range_expression 表示的序列元素的类型,或对该类型的引用。经常使用自动说明符进行自动类型扣除
因此,每次迭代都会引入一个新声明,该引用仅在下一次循环迭代之前存在。
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 如何为静态常量模板化专用整数值分配存储
- 将编译时常量向量转换为堆分配版本
- 对复合分配中的"常量"的混淆
- 传入与在C++中分配常量引用
- 将常量字符* 分配给字符*
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 移动具有常量成员的类的构造和分配
- cpp 数组 - 分配常量索引有效,而非常量索引不起作用
- C++:可以编写忽略常量分配的代码吗?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 为什么在将常量 ptr 分配给常量引用时没有收到编译错误?
- 可选参数常量引用重新分配
- C++分配并使用常量作为初始值设定项
- 如何在C++中将常量引用分配给函数中的指针
- 使用函数中的语句数作为内存分配的常量
- 如何在c++中为指针分配常量地址
- 从头文件 c++ 内的常量二维数组行分配常量 1D 数组
- 预期的常量表达式,不能分配常量大小为0的数组
- 不能分配常量大小为0的数组