auto类型

C++11中引入的auto主要用于类型推导。auto在C++98中“存储类型指示符”的语义,由于使用极少且多余,该语义从C++11开始被删除。

auto类型推导用于从初始化表达式中推断出变量的数据类型,通过此方法可以有效简化代码:

Example:

//简化前的代码  for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++) {     //code }   //简化后的代码  for (auto i = vs.begin(); i != vs.end(); i++) {     //code }

上例中,auto能够自动推导出vs.begin()的类型,从而避免了冗长的类型说明。这个用法是我们大力推荐的。

 

当auto用于模板定义中,其“自适应”性会得到更充分的体现。

Example:

#include<iostream>  template<typename T1, typename T2> double Sum(T1 & t1, T2 & t2)  //从c++14起,也可以支持函数返回值类型设为auto,这种用法多用于编写库的开发人员。 {     auto s = t1 + t2;   //s的类型会在模板实例化时被推导出来     return s; }  int main() {     int a = 3;     long b = 5;     float c = 1.0f, d = 2.3f;      auto e = Sum<int, long>(a, b);      //s的类型被推导为long     auto f = Sum<float, float>(c, d);   //s的类型被推导为float     std::cout << e << "  " << f << std::endl;          return 0; }  //编译选项:g++ -std=c++11  auto1.cpp

上例中,由于类型T1、T2要在模板实例化时才能确定,所以在Sum中将变量s的类型声明为auto。

 

auto可以与指针和引用结合起来使用,使用效果符合我们的想象。如下例所示:

Example:

#include<iostream> #include<typeinfo>  int main() {     int x = 0;     int *y = &x;      auto &b = x;            //int&     auto c = y;             //int*     auto *d = y;            //int*     auto e = b;             //int      return 0; }  //编译选项:g++ -std=c++11  auto2.cpp

本例中,对于c、d两个变量而言,声明其为auto*或auto并没有区别。

而如果要使得auto声明的变量是另一个变量的引用,则必须使用auto&,如本例中的变量b。而本例中e没有带&,则被推导成int类型。正如我们所熟知的,使用引用其实是使用引用的对象,特别是当引用被用作初始值时,真正参与初始化的其实是引用对象的值。

 

其次,auto与const和volatile之间也存在着一些相互关系。const和volatile代表了变量的两种不同的属