前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不懂就问,函数声明后的“ - >”是什么语法?

不懂就问,函数声明后的“ - >”是什么语法?

作者头像
C语言与CPP编程
发布2023-10-23 18:25:53
1160
发布2023-10-23 18:25:53
举报
文章被收录于专栏:c语言与cpp编程c语言与cpp编程

小伙伴们大家好,我是飞宇。

群内有小伙伴问了我这样一个问题"函数声明后的“ - >”是什么??"

我依稀记得这是c++11的一个新语法,回看了下《C++ Primer 5th》后给出了自己的回答,分享一下自己昨天的回答。

这是来自C++ 11的新函数声明语法,它被称为“尾随返回类型”。在函数声明结束时,->表示以下是该函数的返回类型。只有在使用auto关键字而不是您通常期望的实际返回类型时才能使用它。

举例来说,这两个声明是兼容的:

代码语言:javascript
复制
int foo(); 
auto foo() -> int;

根据你的口味,你会发现它比旧的声明语法漂亮,尤其是当返回类型是非常长/复杂:

代码语言:javascript
复制
task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;

但是有时可能需要使用模板,当函数的返回类型可能随参数而变化时。

说你想要一个模板函数添加变量:

代码语言:javascript
复制
template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
}

你只能添加相同类型的变量。假设您希望能够添加任何类型的变量(如add((int)1, (double)2))。

代码语言:javascript
复制
template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
}

问题是你不能事先告诉x + y的结果类型将是什么。作为模板,它们甚至可以是非整数类型。(难道你不能这样做add(std::string("x"), "y")?)

Decltype,以及新的函数声明语法,让你解决这个问题。

代码语言:javascript
复制
template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
}

Decltype“返回”表达式的类型。由于您需要xy已宣布为decltype(x + y)才能正常工作,因此您需要新的语法。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言与CPP编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档