一、auto是什么
auto是一个C/C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式。C语言中提供了存储说明符auto、register、extern、static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。
- 自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。在函数内部定义的变量成为局部变量。
- 静态存储周期(static storage duration)的对象将会被一直保存到程序结束。
二、使用原因
用法就类似于C#中的var关键字,在C++11标准的语法中,auto被定义为自动推断变量的类型。编程时常常需要把表达式的值赋给变量,这就要求声明变量时清楚的知道表达式的类型。然而有些情况是声明的变量的类型我们并不知道,比如在模板编程时。为了解决这个问题,C++11引入了auto类型说明符,用它来让编译器替我们去分析表达式所属的类型。auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型。
#include "stdafx.h" #include <iostream> #include <map> #include <string> int main() { auto x = 5.2; std::map <int, int>m; for (auto it = m.begin();it != m.end(); ++it) { //.... } return 0; }
监视变量x和i发现,x被auto推断为double类型,it被auto推断为map::iterator类型
三、auto的使用规则
1.注意事项
auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。
auto和其他变量类型有明显的区别:
1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型。这类似于const关键字。
2.auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数。
2.auto在编程时真正的用法
在实际编程中我们在明确变量类型情况下,还是使用明确的类型。Auto真正在编程时的实际应用如下:
内容参考至:https://www.cnblogs.com/QG-whz/p/4951177.html
- **代替冗长复杂的变量声明。**如上述变量auto it代替map<int,int>::iterator类型
- 定义模板参数时,用于声明依赖模板参数的变量。
- 模板函数依赖于模板参数的返回值
3.auto的推导规则
内容参考:https://blog.csdn.net/weixin_43744293/article/details/117440727
- 规则1:声明为auto(不是auto&)的变量,忽视掉初始化表达式的顶层const。即对有const的普通类型(int
、double等)忽视const,对常量指针(顶层const)变为普通指针,对指向常量(底层const)的常量指针(顶层cosnt)变为指向常量的指针(底层const)。 - 规则2:声明为auto&的变量,保持初始化表达式的顶层const或volatile 属性。
- 规则3:若希望auto推导的是顶层const,加上const,即const auto。
个人认为,上述的推导规则,不太容易理解,本人也不太理解,可以参照参考博客中的例子进行理解,对于初学者理解auto来说,主要知道auto用来代替冗长复杂或未知的变量声明即可。