1.推导变量类型-auto
在c++11中,可以使用auto自动推导变量的类型,也可以结合decltype来表示函数的返回值
在使用auto时,必须初始化(auto 变量名= 变量值),以便编译器推导实际类型,在编译阶段,将auto占位符替换为真正的类型
int temp = 1435;
auto temp1 = temp;//int
auto &temp2 = temp;//int&
auto temp3 = &temp;//int*
auto *temp4 = &temp;//int*
当变量为指针或者引用时,推导结果会保留const、volatile关键字,否则不会保留这些关键字
const auto a1 = temp;//const int
auto a2 = a1;//int
const auto &a3 = temp;//const int&
auto &a4 = a3;//const int&
const auto& a3 = temp;//const int&
auto* a5 = &a1;//const int
不能使用auto的场景:
1.不能作为函数参数使用
2.不能用于类的非静态成员变量初始化
3.不能定义数组
4.无法推导除模板参数
推荐使用auto的场景:
1.遍历STL的容器
2.用于泛型编程(auto val= 调用模板函数的返回值)
2.推导表达式类型-decltype
decltype 表达式(不需要初始化),主要用于泛型编程
推导规则:
1.当表达式为普通变量、普通表达式、类表达式,推导出来的类型与表达式的类型是一致的
int x = 99;
const int& y = x;
decltype (x)a = x;//int
decltype (y)b = x;//const int&
decltype (Test::vasl)c = 10;//static const int
Test t;
decltype (t.str)d = "";//string
2.表达式是函数调用,推导出来的类型是函数的返回值类型
当函数返回纯右值(字面量常量),对于纯右值,只有类类型可以携带const、volitile限定符能推导出来,除此之外要忽略此限定符
int funcR() {}
int& funcRR() {}//左值引用
int&& funcRRR() {}//右值引用
const int funcC() {}
const int& funcCC() {}
const int&& funcCCC() {}
const Test funcT() {}
decltype (funcR())aa1;//int
decltype (funcRR())aa2 = x;//int &
decltype (funcRRR())aa3 = 0;//int &&
decltype (funcC())aa4;//int,返回纯右值(字面量)忽略const
decltype (funcCC())aa5 = x;//const int&
decltype (funcCCC())aa6 = 0;//const int&&
decltype (funcT())aa7 = Test();//const Test
3.表达式是一个左值(可以取地址的变量),或者被()包围,推导出来是表达式的引用,此情况下不能忽略const、volitile限定符
const Test tt;
//()表达式
decltype (tt.num)bb1;//int-类表达示
decltype ((tt.num))bb2 = x;//const int&
cout << "bb2 = " << bb2 << endl;
//+表达式
int m = 44; int n = 55;
decltype (m + n)cc1;//普通表达式-int
decltype (m = m + n)cc2 = x;//int&
3.返回类型后置
auto func(参数1,参数2,·····)->decltype(表达式),auto会自动追踪decltype()推导的类型
//R为返回类型,U、V为参数类型
template<class R,typename U,class V>
R add(U u,V v){
return u + v;
}
//返回值类型后置 auto func(参数1,参数2,·····)->decltype(表达式)
template<typename U, class V>
auto add2(U u, V v) ->decltype(u+v){
return u + v;
}
void test_auto_decltype() {
int a = 4;
double b = 4.5;
//已知模板函数的实现,当你不知道模板函数的实现时,不能使用此方式
auto ret = add<decltype(a + b), int, double>(a,b);
//返回值类型后置 auto func(参数1,参数2,·····)->decltype(表达式)
auto ret2 = add2<int, double>(a, b);
auto ret2 = add2(a, b);
}