一、函数返回类型
一般来说,在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++有一定的了解。否则,就慢慢的学习一下,要有心理准备被虐的准备。
努力要从今日始!少年归来自可期!