auto  关键字在  C  语言中就已经存在了,只不过在  C  语言中它的作用是声明自动变量,例如 
 
 
auto int z = 123 ;
         z  本来是局部变量,加上  auto  后变成了局部的自动变量,就是当前变量的生存周期是由编译器自动决定的,但是这和局部变量没有区别,所以  auto  在  C  语言中并没有发挥什么作用。 
 
         在 C++11 中,就赋予了 auto 一个新的功能-自动类型推导。auto 声明的变量必须由编译器在编译时期推导而得,简单来说就是由编译器来识别变量的类型。 
 
         注意:使用 auto  定义变量时必须对其进行 初始化 ,在编译阶段编译器需要根据初始化表达式来推导 auto  的实际类型。因此  auto  并非是一种 “ 类型 ” 的声明,而是一个类型声明时的 “ 占位符” ,编译器在编译期会将  auto  替换为变量实际的类型。  
 
auto a; //错误,使用 auto 初始化变量必须赋值auto 使用注意事项
 1.不能作为函数参数,例:  
 
void func(auto x, auto y) {}
void func(auto x, double y) {}
int main() 
{func(1, 2);func(1.2, 1.2);return 0;
} 编译报错,影响重载形式下的调用绑定 
 
 2.无法作为模板参数  
  3.无法定义数组  
  4.不能定义类中的非静态成员变量  
  5. 当在同一行声明多个变量时,这些变量必须是 相同的类型 ,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。  
 
void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0; // 该行代码会编译失败,因为 c 和 d 的初始化表达式类型同
} 6.  用 auto 声明指针类型时,用 auto 和 auto*  没有任何区别 ,但用 auto 声明引用类型时则必须加&,例:  
 
int main()
{int x = 10;auto a = &x;//与下面 auto* 声明没有区别auto* b = &x; //与上面 auto 声明没有区别auto c = x; //auto 推导出来是一个 int 型,c 并不会是 x 的引用auto& c = x; //正确写法return 0;
} 7.auto 会自动去除 const 属性,解释如下: 
 
int main(int argc, char const *argv[])
{const int a = 10;auto b = a; //b 为 int,不会推导为 const intauto c = 'A'; //c 推导为 char,不会推导会 const charauto &d = a; //这个时候 d 就会带 const 属性了,因为它是 a 的引用return 0;
}