c++ - 为什么在这个例子中有 "for(auto& x : v)"而不是 "for(auto x : &v)"?

标签 c++ pointers reference

我在 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/

相关文章:

reference - gmock 多个输入输出参数 SetArgReferee

language-agnostic - 什么是好的 UML 引用,为什么?

javascript - 引用php页面上的位置

c++ - 为什么切片非根基类会产生正确答案?

c++ - 如何在 C++ 代码中捕获 python 标准输出

c - 如何将指针与 getc 结合使用?

c - 错误 : invalid type argument of unary '*' (have 'int' )

c++:将 24bpp 转换为 8bpp 或 1bpp 图像

c++ - 运算符链接在 C++ 中是如何发生的?

c - 指向同一堆区域的随机地址的双指针