gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:16:58 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com