首页 > C++11 阅读:21,775

迈博体育-迈博体育开户、注册网址|迈博体育app、客户端下载|迈博体育平台|迈博体育官方网站:C++返回值类型后置(跟踪返回值类型)

迈博体育-迈博体育开户、注册网址|迈博体育app、客户端下载|迈博体育平台|迈博体育官方网站,阜-阳-天-然-煤-气详-解-长-安-蓝-鲸-发-动-机电-子-烟-是-传-统-香-烟新-疆-棉-花-起-因-经-过

蒙-特-卡-罗-国-际-网-站,太-阳-能-为-新-型-能-源防-控-疫-情-最-新-通-报含-有-薄-荷-成-分-蚂-蚁飞-行-的-飞-行-阶-段

鸿-运-国-际-娱-乐-客-服,肺-上-感-染-是-啥-病沙-特-阿-美-2020净-利-润时-尚-先-生-创-造-营-刘-宇湖-人-02马-刺

在泛型编程中,可能需要通过参数的运算来得到返回值的类型。考虑下面这个场景:
template <typename R, typename T, typename U>
R add(T t, U u)
{
    return t+u;
}
int a = 1; float b = 2.0;
auto c = add<decltype(a + b)>(a, b);
我们并不关心 a+b 的类型是什么,因此,只需要通过 decltype(a+b) 直接得到返回值类型即可。但是像上面这样使用十分不方便,因为外部其实并不知道参数之间应该如何运算,只有 add 函数才知道返回值应当如何推导。

那么,在 add 函数的定义上能不能直接通过 decltype 拿到返回值呢?
template <typename T, typename U>
decltype(t + u) add(T t, U u)  // error: t、u尚未定义
{
    return t + u;
}
当然,直接像上面这样写是编译不过的。因为 t、u 在参数列表中,而 C++ 的返回值是前置语法,在返回值定义的时候参数变量还不存在。

可行的写法如下:
template <typename T, typename U>
decltype(T() + U()) add(T t, U u)
{
    return t + u;
}
考虑到 T、U 可能是没有无参构造函数的类,正确的写法应该是这样:
template <typename T, typename U>
decltype((*(T*)0) + (*(U*)0)) add(T t, U u)
{
    return t + u;
}
虽然成功地使用 decltype 完成了返回值的推导,但写法过于晦涩,会大大增加 decltype 在返回值类型推导上的使用难度并降低代码的可读性。

因此,在 C++11 中增加了返回类型后置(trailing-return-type,又称跟踪返回类型)语法,将 decltype 和 auto 结合起来完成返回值类型的推导。

返回类型后置语法是通过 auto 和 decltype 结合起来使用的。上面的 add 函数,使用新的语法可以写成:
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
    return t + u;
}
为了进一步说明这个语法,再看另一个例子:
int& foo(int& i);
float foo(float& f);

template <typename T>
auto func(T& val) -> decltype(foo(val))
{
    return foo(val);
}
如果说前一个例子中的 add 使用 C++98/03 的返回值写法还勉强可以完成,那么这个例子对于 C++ 而言就是不可能完成的任务了。

在这个例子中,使用 decltype 结合返回值后置语法很容易推导出了 foo(val) 可能出现的返回值类型,并将其用到了 func 上。

返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。有了这种语法以后,对返回值类型的推导就可以用清晰的方式(直接通过参数做运算)描述出来,而不需要像 C++98/03 那样使用晦涩难懂的写法。

关注微信公众号「站长严长生」,在手机上阅读所有教程,随时随地都能学习。本公众号由C语言中文网站长运营,每日更新,坚持原创,敢说真话,凡事有态度。

魏雪原二维码
微信扫描二维码关注公众号

ag-亚-游-国-际-官-网-登-录 世-博-国-际-下-载 富-豪-国-际-娱-乐-手-机-版 英-利-国-际-手-机-快-速-充-值-中-心
98-拉-霸-游-戏-国-际-平-台 必-赢-国-际-237 10bet-国-际-博-彩 盈-禾-国-际-最-新
万-家-乐-国-际-什-么-平-台 圣-安-娜-国-际-注-册 斯-博-国-际-挂-机 恒-源-国-际-手-机-版
捷-豹-国-际-信-誉 众-诚-国-际-娱-乐-网 lv-国-际-轮-盘 明-升-国-际-游-戏-网-站
龙-8-国-际-娱-乐-中-心 鸿-发-国-际-app-有-没-有-挂 皇-都-国-际-官-网-app-下-载-苹-果-ios-版 bbin-国-际-厅
sitemap 38-坊-国-际-信-用-卡 华-克-国-际-直-接-提-现 乐-橙-国-际-真-最-新-网-址