gpt4 book ai didi

c++ - 使用 '&'进行迭代时 'auto'符号有什么作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:25:06 25 4
gpt4 key购买 nike

最近我在 C++ 中使用 auto 时遇到了非常非常奇怪的问题,只是......看看下面的代码片段:

我的主要功能:

#include <list>
#include <iostream>
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
list<int> what;
what.push_back(a);
what.push_back(b);
what.push_back(c);

read(what);

return 0;
}

这里的函数是:

void read(const list<int>& con){

for (auto it : con){
printf("%p\n", &it);
cout << it << endl;
}
return ;
}

这是输出:

0x7fffefff66a4
10
0x7fffefff66a4
20
0x7fffefff66a4
30

这是什么鬼? 相同地址但内容不同 !?

更奇怪的是,如果我通过添加 '&' 来修改 for 循环
即:

for (auto& it : con){

所有输出立即有意义,地址会随着迭代而改变

所以我的问题是,
为什么“&”符号在这种情况下会发生变化?

最佳答案

for (auto it : con){

Same address with different content !?

这对于具有自动存储持续时间的变量来说是非常典型的。这与 C++ 中的 auto 无关。如果您使用 int,您会得到相同的结果:

for (int it : con){

it(以及循环中的每个自动变量)的生命周期只是一次迭代。由于 it 在上一次迭代中的生命周期结束,下一次迭代可以重新使用相同的内存,这就是地址相同的原因。


Why does the '&' sign make a change under this circumstance?

因为 T& 声明了一个 reference 来键入 T。引用变量不同于非引用(对象变量)。引用不是像对象那样持有一个值,而是“引用”另一个对象。

当您在引用上使用 addressof 运算符时,结果将是引用对象的地址;不是引用的地址(它甚至可能没有地址,因为它不是对象)。这就是后一种情况下地址发生变化的原因。在这种情况下,引用将引用存储在 what 节点中的 int 对象(因为 con 本身是一个引用,并且引用传递的对象)。


† 我在 C++ 中提到,因为在 C 中 auto 实际上是表示自动存储类的存储类修饰符。它在标准 C++ 中从来没有这种含义,它在 C 中的使用也已过时。这是 B 语言的残留关键字。

在 C++ 中,auto 声明一个将从上下文推导的类型。

关于c++ - 使用 '&'进行迭代时 'auto'符号有什么作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655981/

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