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++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)