c++浅谈decltype类型指示符

decltype类型指示符相当于auto指示符的改进版,使用此类型指示符能让被定义变量的类型指定为程序中已有,而我们不好直接写出的(比如某个函数的输出结果有多种数据类型的可能,而下面我们要定义的变量类型需与函数返回值类型一致),便可以使用decltype类型指示符。

例如:

decltype (f()) sum=x;//sum的类型为函数f的返回类型

应注意,在其他类型指示符下,引用都作为所指对象同义词出现,但用在decltype下,引用类型由decltype()括号中的引用类型决定。

例如:

const int ci=0, &cj=ci;
decltype(ci) x=0;//x是
decltype(cj) y=x;//y是const int&类型的引用,引用必须赋初值

如果decltype使用的表达式不是一个变量,则decltype返回表达式结果对应的类型,出现这种情况说明表达式结果对象能作为一条赋值语句的左值。

如:

int i=42,*p=&i,&r=i;
decltype(r) b=i;//这样直接使用r的话由于r是个引用,定义的b也是int &类型的
				//引用,就需要赋初值。

但如果想让结果是r所指向的类型而非r的类型,即想让结果为数值而非引用,则需将r作为表达式的一部分,即:

decltype(r+0) b;//这样就得到一个不需要初始化的int类型变量b了

此外,如果表达式内容为解引用操作,,则decltype将得到引用类型。因为解引用指针将得到指针所指的对象,并且可以给该对象赋值。

decltype(*p) c=i;//解引用后得到的类型为int &,需要赋初值
//这里的解引用可以通俗的理解为,定义指针p指向&i,则p表示&i的地址,*p表示的
//就是&i本身,这样decltype得到的就是int &类型

还有很重要的一点需要注意,对于decltype使用的表达式,若不在表达式外加括号,则得到的结果是该变量类型;若在表达式外还有一对括号,则编译器将其视为可作赋值语句左值的特殊表达式,在c++中,若表达式为赋值语句如i=x,则该表达式的类型为引用类型(若i为int,则decltype(i=x)的类型为int &类型),因此,在编译器将双括号语句视为赋值语句时,decltype将会得到引用类型。

decltype((i)) d=i;//表达式"i"外还有一对括号,得到的是引用类型int &
decltype(i) e;//无括号,得到i的变量类型int

decltype(( ))的类型永远是引用,decltype()的结果只有当表达式本身是一个引用时才是引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值