C++11 range-for 中的auto,auto&, auto&&, const auto&

解博明
2023-12-01

range-for 是对一定范围内的(如容器vector或者一段string)的循环遍历语句,从头到尾。参考Range-based for loop (since C++11) - cppreference.com<

Executes a for loop over a range.

Used as a more readable equivalent to the traditional for loop operating over a range of values, such as all elements in a container. 

>

我们需要声明一个变量,叫做range-declaration(如下文中的变量c), 并且需要为其确定一个类型,通常我们用auto这个关键字 ,进行自动类型推导。

此时就涉及到标题中auto,auto&, auto&&, const auto&的使用,其实更多的是C++中值传递,引用传递,右值引用等知识,使用以下代码进行了测试,以及测试结果。

#include <stdio.h>
#include <iostream>
#include <vector>
#include <numeric>
#include <string>
using std::vector;

int main()
{

//测试1:auto c, 创建拷贝,每次遍历都是copy一次,不会对str中的元素进行修改
	std::string str("str ing1");
	for (auto c : str)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str<<'\n';  //这时再看原str字符串,仍然输出str ing1,没变化。

//测试2:auto& c, reference, 可以通过c给str2中的元素赋值
	std::string str2("str ing1");
	for (auto& c : str2)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str2<<'\n';  //这时再看原str2字符串,输出tus!joh2,被重新赋值了。

//测试3:auto&& c,右值引用, 可以修改str3中的元素
	std::string str3("str ing1");
	for (auto&& c : str3)
	{
		c+=1;
		std::cout<<c;  //输出tus!joh2,c每次获取str的元素后,加1,再打印
	}
	std::cout<<'\n';
	std::cout<<str3<<'\n'; //这时再看原str3字符串,输出tus!joh2,被重新赋值了。

//测试4:const auto&, 只读str4中的元素
	std::string str4("str ing1");
	for (const auto& c : str4)
	{
		//c+=1;  //报错,assignment of read-only reference 'c',const限定c只读
		std::cout<<c;
	}
	std::cout<<'\n';
	std::cout<<str4<<'\n';
}

初学C++,记录一下,随时更新。有不对/片面的地方,请评论区及时指正。

学习时用的参考链接:

C++ 遍历循环表达示 auto, auto&, auto&&

C++ 中的auto、auto&、auto&&、const auto&_橙橙小狸猫的博客-CSDN博客_auto&&

Range-based for loop (since C++11) - cppreference.com

 类似资料: