关键字 auto 用于自动类型推导

auto x=0;     // int
auto c='a';   // char
auto d=0.5;   // double

自动类型推导主要用于声明比较复杂的变量,或者变量是在泛型编程(模板)中自动生成出来的。

vector<int> vecNumbers;
vector<int>::const_iterator it = vecNumbers.begin();
auto it = vecNumbers.begin();

auto 类型推导并不会指定 constvolatile 属性

如果需要限定声明的变量为 constvolatile 属性,需要额外提供相应的关键字限定。因为编译器并不能推断出声明的变量是否具有常值属性和易失属性。

volatile auto num=5;           // volatile int
auto volatile const var=true;  //const valatile bool
auto const ch='a';             // const char

关键字 decltype 用于获取一个对量的类型

使用 decltype 存储一个对象或表达式的类型, decltype 可以看做是 auto 的补充。

vector<int> vecNumbers;
typedef decltype(vecNumbers.begin()) Iterator;
Iterator it2;

函数返回值类型推导

在C++11中可以使用 autodecltype 完成函数返回类型的推导。
旧的函数声明格式 return_type func_name(param_type param, ...);
新的函数声明格式示例如下,以下函数接收 bool 作为函数的参数,并返回 bool 类型的结果。

auto func_name(bool bParam)->decltype(bParam)
{
  return bParam;
}

函数返回值类型推导在模板泛型编程中非常有用,模板函数能够定义一个通用的返回类型,返回值类型会根据 decltype 自动推导。
新的函数声明格式更易于维护,因为返回值并没有作为硬编码写入源文件中,但这样做可能会牺牲代码的可读性。

template <class T>
auto get_end(vector<T>& v) -> decltype(v.end())
{
  return v.end();
}

vector<int> vecNumbers;
auto it = get_end(vecNumbers);      // returns iterator

const vector<int> vecNumbers2;
auto it2 = get_enm(vecNumbers2);    // returns const_iterator