C++11 auto进行for循环时,循环变量的地址问题
Posted wtxuebc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++11 auto进行for循环时,循环变量的地址问题相关的知识,希望对你有一定的参考价值。
在C++11中,有类型推导的关键字 auto 和 decltype ;本文主要记一个小问题:给循环变量加引用的区别;
不过在这之前,可以先看一下另一个小问题:有了 auto,为什么要有 decltype(这和本文的问题无关,仅作拓展)
auto 的用法:根据初始值去判断变量的类型;所以!auto定义的变量必须要有初始值!如:
- auto a = 1; 即可推断出 a 为 int 类型,当然如果1后面有小数部分,即可推断出为浮点类型。
- auto str = “hello”; 即可推断出str为 string 类型
而 decltype 是根据表达式的类型去推断出变量的类型
我们希望从表达式中推断出要定义变量的类型,但却不想用表达式的值去初始化变量,或者当函数的返回值类型为某表达式的值的类型,这个时候, auto 显得就很无力了;
所以 C++11 又引入了第二种类型说明符 decltype 。它的作用是选择并返回操作数的数据类型。在此过程中,编译器只是分析表达式或函数的返回值的类型并得到它的类型,却不进行实际的计算表达式的值。如:
- string func ( )
return “hello”
decltype(func()) a; 即可推断出 a 为string 类型;注意和 auto 一样,都是比编译器执行的,所以根本不会在乎函数的执行结果,只获取返回类型; - int i;
decltype(i) b;
即可推断出 b 的类型为 int
decltype注意的一个细节:
**如果 decltype 使用的是一个不加括号的变量,那么得到的结果就是这个变量的类型。但是如果给这个变量加上一个或多层括号,那么编译器会把这个变量当作一个表达式看待,变量是一个可以作为左值的特殊表达式,所以这样的decltype就会返回引用类型。**如:
- int i ;
- decltype(i) b; // 推断出 b 为 int 类型
- decltype((i)) b; // 推断出 b 为 int & 引用类型
写到这发现有点头重脚轻了,本文标题也就不改了,回到本文关注的一个问题:使用 auto 进行 for 循环时,循环变量的地址问题
在C++11中,使用 auto 进行for循环时,循环变量有两种写法,分别如下:
vector<int> arr = 1,2,3,4;
cout<<"不带引用"<<endl;
for (auto x : arr)
cout << &x << endl;
cout<<"带引用"<<endl;
for (auto &x : arr)
cout << &x << endl;
先看结果吧
编译运行环境:VS2019
发现不带引用的地址为同一个。可得结论:
在范围for语句中,循环变量不使用引用的时候,每次读取vector容器中元素的副本存到该循环变量中,因此输出的地址为该循环变量的地址,自然是同一个的。
当循环变量使用引用的时候,每次传递给循环变量的是容器中元素的地址,
所以,得到得地址容器里元素得地址。
如果使用vector,得基于元素进行写操作得时候,需要给循环变量加引用,这样就会得到不同元素得地址基于不同元素在操作;
如果只是对vector容器进行读操作,可以不加引用,因为每次将元素得副本传给了循环变量,对循环变量进行读操作即可!
我只是大概粗略得写了一下,看到得朋友也可以深究一下。
以上是关于C++11 auto进行for循环时,循环变量的地址问题的主要内容,如果未能解决你的问题,请参考以下文章
C++11使用auto关键字进行基于范围的for循环,引用符号&的作用
喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)
喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)
喵呜:C++基础系列:auto关键字(C++11)基于范围的for循环(C++11)指针空值nullptr(C++11)