为什么在此示例中有“ for(auto&x:v)”而不是“ for(auto x:&v)”?

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)

lub*_*bgr 5

这是一个很好的初学者问题。看一下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,但是后者几乎没有用处。