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;
} //正确