decltype和拖尾返回类型

224 篇文章 92 订阅

一、函数返回类型

一般来说,在c++这种强类型语言里,返回类型摆明了应该是显示的、无歧义的。换句话说,其实decltype从静止的眼光看,在c++中意义不大。但是,凡事都怕但是嘛。语言不是静止不前,是发展的,在一些场合,是需要对一些返回类型做推导的,而这其中就不可避免的需要。其实对于支持RUNTIME的语言来说,这都不是事儿。更或者如果是弱类型语言的话这也不是啥了不起的。
decltype这个语法关键字的用法很多,这里只谈这个返回类型中的应用,有兴趣可以查看以前相关的文章。c++11(更准确的说是c++14才更完善)中引入了这个关键字,用来做为函数返回值的一种情况,即函数拖尾时的数据类型的自动推导。这个函数拖尾的名词,还不能说翻译的权威,大家明白意思即可。

二、函数拖尾

在c++语言中,函数的返回值如果是一个表达式,则可以使用decltype来进行处理,但是标准的直接应用又无法通过编译器的编译,那么则可以使用下面的方法:

template <typename T1, typename T2>
auto Add(T1 a, T2 b) -> decltype(a+b)
{
    return a + b;
}

这个就是函数拖尾。auto在这的意思是告诉编译器,类型是由后面的decltype决定的。auto后面拖着一个->的decltype的类型判断小尾巴。这也算是decltype的一个函数辅助用法,其实说到底,仍然是对类型的动态解析,这也是c++对类型推导的一个方式。

三、decltype(auto) 和函数拖尾

在上面的函数拖尾中,其实看上去是有些笨拙,或者稍显丑陋,所以在c++14中有了一种更好的表示方法:

template <typename T1, typename T2>
decltype(auto) Add(T1 a, T2 b) 
{
    return a + b;
}

换句话说,这两种情形是等价的。但是这里有一个问题出现了,在学习auto关键字时,已知它是可以做为返回值使用的,那么,这两种情形有什么不同的?为什么不能直接使用auto呢?回答这个问题很简单,首先,能够直接判断返回类型的,就用auto(这句话的意思是,auto未必能正确推断出原有类型),而需要推导的就用这个拖尾方式。其次,这种拖尾方式返回的是引用类型,而auto返回的值类型。同时,拖尾方式保留了c限定符。

四、总结

c++11标准以上,提供了一系列的新的小技能(意思是好用),比如常和decltype可以配合使用的declval,constexpr等等,最好手头还是下个标准文档,这样配合着官方的网站,对着例程,没有什么不能搞定的。当然,前提是得对c++有一定的了解。否则,就慢慢的学习一下,要有心理准备被虐的准备。
努力要从今日始!少年归来自可期!
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值