除了auto类型说明符以外,C++11引入了第二种类型说明符decltype,它的作用是选择并返回操作数的数据类型。decltype可以作用于变量和表达式。
一)作用于变量
当decltype作用于变量时,将保留变量的所有特性(包括顶层const和引用)
const int i = 0, &j = i;
decltype(i) a = 0; // a的类型为const int
decltype(j) b = a; // b的类型为const int&, 绑定到变量a
decltype(j) c; // 编译错误,c的类型为const int&, 必须初始化
注:如果变量加上了一对括号,则编译器会按照表达式处理,会得到引用类型
decltype((i)) d = i; // d的类型为const int&
二)作用于表达式
当decltype作用于表达式时,编译器只分析表达式并得到它的类型,并不计算表达式的实际值。
表达式的结果如果是左值,则得到该类型的左值引用。
表达式的结果如果是右值,则得到该类型。
int a = 1;
decltype(++a) b = a; // ++a结果为左值,所以b的类型为int &, b为a的别名
decltype(a++) c = a; // a++结果为右值,所以c的类型为int, 使用a的值初始化
a = 5;
最终结果, a = 5, b = 5, c = 1;