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的指针
  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值