我在 Bjarne Stroustrup 的 The C++ programming language (4. edition) 中找到了这段代码。
在这个例子中,就我的理解而言,我们递增 x 而不将 v 的值复制到 x 中。我的问题是,为什么我们引用 x 而不是 v?
我试图通过分解问题并将其写在纸上来理解问题,从而简化内存中发生的事情,但我不明白。
void increment()
{
int v[]={0,1,2,3,4,5,6,7,8,9};
for(auto& x : v)
{
++x;
}
}
最佳答案
这是一个很好的初学者问题。看看 cppreference 在 range-based for loops 上有什么.因为 v
是数组类型,所以上面的代码片段扩展为
{
auto && __range = v;
for (auto __begin = __range, __end = (__range + bound);
__begin != __end; ++__begin)
{
auto& x = *__begin;
++x
}
}
其中“bound
是数组中元素的数量(如果数组的大小未知或类型不完整,则程序格式不正确)”[引用上述链接] .
我们可以看到,这种基于范围的 for 循环背后的机制确保我们在此处对 v
的左值引用进行操作:auto && __range = v
使用带有转发引用的类型推导,这是正确的做法。
简而言之,通过循环中的 auto& x
部分,您可以控制当指向范围的迭代器被取消引用时初始化的内容 (*__begin
)。例如,使用 auto& x
可以获得对范围内元素的引用(您可以更改它,从而影响范围),使用 const auto& x
可以得到 const
- 对范围内元素的限定引用(不能改变)。您可以使用 auto x
获取每个元素的拷贝,并使用 const auto x
获取每个元素的 const
限定拷贝,但后者几乎没有用.
关于c++ - 为什么在这个例子中有 "for(auto& x : v)"而不是 "for(auto x : &v)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409650/