Bal*_*sök 5 c++ pointers reference
我在Bjarne Stroustrup的The C ++编程语言(第4版)中找到了此代码。
在此示例中,据我所知,我们递增x而不将v的值复制到x中。我的问题是,为什么我们引用x而不引用v?
我试图通过将问题分解并写到纸上来理解问题,简化内存中会发生什么,但我不明白。
void increment()
{
int v[]={0,1,2,3,4,5,6,7,8,9};
for(auto& x : v)
{
++x;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个很好的初学者问题。看一下cppreference在基于范围的for循环中有什么。由于v是数组类型,因此以上代码段扩展为
{
auto && __range = v;
for (auto __begin = __range, __end = (__range + bound);
__begin != __end; ++__begin)
{
auto& x = *__begin;
++x
}
}
Run Code Online (Sandbox Code Playgroud)
其中“ bound是数组中元素的数量(如果数组的大小未知或类型不完整,则程序格式不正确)” [来自以上链接的引用]。
我们可以看到,这种基于范围的for循环背后的机制确保了我们对v此处的左值引用起作用:auto && __range = v将类型推导与转发引用一起使用,这样做是正确的。
简而言之,通过将auto& x零件放入循环中,您可以控制取消引用指向该范围的迭代器(*__begin)时正在初始化的内容。例如,通过auto& x获得对范围内元素的引用(可以更改,影响范围),使用const auto& x可以得到const-限定范围内元素的引用(不能变异)。您可以使用获取每个元素的副本auto x,并使用来获取每个元素的const-qualified副本const auto x,但是后者几乎没有用处。
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |