1.从概念的产生背景上
编程的时候,常常需要把表达式的值赋值给变量,但是很多时候,我们往往并不能清楚的知道表达式的类型,这一棘手的问题催生了C++11新标准提出了auto这个概念的产生。有时候我们仅仅需要知道表达式表示的数据类型,而不需要用该表达式的值来初始化变量,这时我们就可以使用C++11提供的decltype标识符。
2.从具体的使用方法上
(1)auto的使用方法
①auto推断基本类型(一条语句一个变量)
auto item=val1+val2; //item初始化为val1和val2相加的结果
②auto推断基本类型(一条语句多个变量)
auto i=0,*p=&i; //正确,i是整数,p是指向i的指针
auto sz=0,pi=3.14; //错误,sz和pi的类型不一致
使用auto能在一条语句中声明多个变量,因为一条语句中只能有一个基本数据类型,所以语句中所有变量的初始基本数据类型都可以一样。
③auto推断引用
int i=0,&r=i;
auto a=r;//a为int,因为r是i的别名,i为int。
在涉及引用类型的推断的时候,编译器将引用对象的类型作为推断类型。
④auto与const相关的推断
const int ci=i,&cr=i;
auto a=ci; //a为int(忽略顶层const)
auto b=cr; //b为int(忽略顶层const,cr是引用)
auto c=&i; //c为int *
auto d=&ci; //d是pointer to const int(&ci为底层const)
总结一下其实就是,顶层const会被忽略,底层const会被保留。如果你对顶层const和底层const的概念的理解理解不是特别清楚可以参见博客,详见博客。
⑤既然auto仅仅保留底层cosnt,而且引用是根据引用对象的类型推断的,那么我们如何使用auto声明引用和顶层const呢?
实际的使用例子,往往是理解程序概念最有效的方法,我们还是通过几个例子来理解:
const auto f=ci; //ci的推演类型是int,f是const int
auto &g=ci;// g是一个绑定到ci的引用
要声明顶层const,前面要加上const关键字;要声明引用要加上&标识符。
⑥auto和函数指针
auto声明函数指针是通过尾置返回类型来实现的,尾置返回类型这个概念看上去比较拗口,其实理解起来一点都不难,我们可以通过一个例子来阐述:
auto f()->int (*)(int,int);//返回一个指向int(int,int)的指针
//int(*)(int,int)就是尾置返回类型
(2)decltype的使用方法
①decltype的基本使用方法
decltype(f()) sum=x; //sum的类型就是f返回值的类型
②处理顶层const(与auto不相同)
const int ci=0;
decltype(ci) x=0; //x的类型是const int
③decltype和引用(与auto不相同)
a.如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型。例如,
int i=42,*p=&i,&r=i;
decltype(r+0) b; //b为int
b.如果decltype使用表达式的结果类型可以作为一条赋值语句的左值,那么decltype返回一个引用类型,例如解引用操作和变量加括号的类型。
decltype(*p) c=n; //c为int&,必须初始化
decltype((i)) d; //d为int&,必须初始化
c.如果表达式类型本身就是一个引用类型,那么decltype返回对应类型的引用类型。
const int &cj=ci;
decltype(cj) y=x; //y的类型是const int&,y绑定到x上
注意,引用都是作为引用对象的同义词出现,只有用decltype处是一个例外。
④decltype与函数指针
decltype声明函数指针的时,关键是要记住decltype返回的是一个函数的类型的,因此要加上*声明符才能构成完整的函数指针的类型。
string::size_type sumLength(const string&,const string&);
decltype(sumLength)* getFcn(cosnt string&);//返回指向 sumLength的指针