Cpp 11 中的auto 以及 decltype

auto的使用

auto 让编译器在编译阶段就推导出变量的类型。

auto var = 1024; 	//var 是int类型
auto var1 = 1024.0 	//var 是double类型

int i=1024
auto a = i, &b = i, *c = &i;   //auto 推导出为int
auto error; //error auto必须进行初始化。

const int  d = 0;
auto e = d;  // e是int ,不是const int

注意事项:

  • auto 无法作为函数参数使用。
  • 使用auto时,不能有二义性的推导,例如 auto x = 0,z=0.0
  • 在类中,auto不能够作为非静态成员变量。(测试下来静态成员变量也不行)
  • auto 不能定义数组,能定义指针
  • auto 不能推导模板参数。

decltype

decltype则用于推导表达式类型,这里只用于编译器分析表达式的类型,表达式实际不会进行运算.

double function(){return 0.0;}
decltype(function()) var; //var为double

const int i=0;
decltype(i) var; //var 是 const int

decltype(exp):

  • exp是表达式,那么类型和exp类型相同
  • exp是函数调用,那么类型和函数调用后的返回值相同。
  • exp是左值,那么类型是exp类型的左值引用。
int a=1,b=2;
decltype(a+b) c; //c是int
decltype(a += b ) d; //d 是int &,a+=b返回左值

int *p = &(a+=b); //a+=b返回左值(可以取地址)

返回类型后置:

解决函数返回值依赖参数,但却难以确定返回值类型的问题。

template<typename T, typename U>
decltype(t + u) add(T t, U u) { // t和u尚未定义
    return t + u;
} //无法编译通过


template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
    return t + u;
} //正确