C++基本概念——细数auto和decltype之间的区别

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。

       在涉及引用类型的推断的时候,编译器将引用对象的类型作为推断类型。

autoconst相关的推断

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; //bint
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的指针

你可能感兴趣的:(C++重要的基本概念)