【发布时间】:2019-08-08 09:42:43
【问题描述】:
我在 Bjarne Stroustrup 的 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;
}
}
【问题讨论】:
-
auto& x将x声明为对某事物的引用,并且在循环int数组的上下文中(v是什么),那么我们让编译器推断出@987654327 @ 是对int的引用。如果你写for (int& x : v),你会得到同样的结果。 -
我认为你需要仔细阅读en.cppreference.com/w/cpp/language/range-for。它应该有帮助;)
-
for (auto &x : v)表示在每次循环迭代中,x是对v元素的引用。for (auto x : &v)将意味着x是&v的元素的值,这是没有意义的,因为&v是v的地址并且不是容器(即它不代表元素范围) . -
还请记住,与许多其他运算符一样,
&可能意味着不同的含义,具体取决于上下文。在例如的上下文中auto& x(或int& x)然后它用于声明一个作为引用的变量。在&v的上下文中,这是创建指向v(int (*)[10]类型)的指针的地址运算符,这似乎不是预期的。