我是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都是单独初始化的.
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.
基于范围的for看起来像这样:
attr(可选)用于(range_declaration:range_expression)loop_statement
其中range_declaration是
range_declaration - 命名变量的声明,其类型是range_expression表示的序列元素的类型,或对该类型的引用.经常使用auto说明符进行自动类型推导
因此,每次迭代都会引入一个新的声明,该引用只存在于下一个循环迭代之前.
| 归档时间: |
|
| 查看次数: |
1116 次 |
| 最近记录: |