C++11学习之auto关键字

auto关键字在c++11之前,表示存储类型指示符,表示具有自动存储期的局部变量。
比如

auto int a = 0;
static int j = 0;

以上两者是相对的,一个在出变量作用域就会释放内存,static变量会存放在静态数据区,对于未初始化的会自动初始化未为0,在程序结束后才会释放内存。

在c++11标准中,auto变成了一个类型指示符,用来提示编译器对此类型的变量做自动推导,但是有一些注意的地方需要说明,

  1. 当变量不为指针或引用时,auto进行推导会抛弃const和volatile属性
  2. 变量是指针和引用时,auto保留const和volatile属性

例子

	//普通变量
	auto i = 0;		// int i
	const auto j = i;	//const int j
	auto k = j;		//int k  j->k 没有继承cv属性 const/volatile


	//指针引用类型 会继承原有的cv属性
	auto* a = &i;  //int *a
	const auto* c = &i;

在VS上可以将鼠标悬浮在变量名上,查看变量类型。
C++11学习之auto关键字_第1张图片

有四种情形没有办法使用auto,分别是

  1. auto无法作为函数形参
  2. 没有办法修饰数组
  3. 不能用于非静态成员变量
  4. 无法做模板类型推导
    举例
//auto的4处限制
//1.	不能作为函数参数进行推导
void fun(auto a) //err 此处不允许使用auto
{
	return a;
}
//2.	不能用于非静态的成员变量
struct{

	//auto const a = 0;		 //err 此处不允许使用auto
	static const auto b = 0;
};
//3.	无法初始化数组
//auto arr[10] = { 0 };	//C++ “auto”类型不能出现在顶级数组类型中

//4.	无法推导模板参数
template<typename T>
class bar{};

bar<int> b;
//bar b1;		//err 此处不允许使用auto

使用auto的好处

使用迭代器不在需要大段的编写类型定义,以下是关于输出map在c++98 11 17 的代码。

std::map<int, std::string> m;

	m.insert({ 1, "world" });

	//c++17引入的特性
	for (const auto& [number, name] : m)
	{
		std::cout << number << "|" << name << std::endl;
	}

	//c++98
	std::map<int, std::string>::iterator it = m.begin();
	for (; it != m.end(); it++)
	{
		std::cout << it->first << "|" << it->second << std::endl;
	}

	//c++11
	auto it = m.begin();
	for (; it != m.end(); it++)
	{
		std::cout << it->first << "|" << it->second << std::endl;
	}

你可能感兴趣的:(Modern,C++,c++11,c++,开发语言,后端)