当前位置: 首页 > article >正文

函数声明后的“ - >”是什么?

这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。

先来看一个使用尾返回类型的例子:

#include <iostream>
auto add(int a, int b) -> int
{
    return a + b;
}

int main() 
{
    std::cout << add(3, 4) << std::endl;  // 输出 7
    return 0;
}

在这个例子中,add 函数声明使用了尾返回类型,通过 -> int 指定了函数的返回类型为 int。这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。

需要注意的是,尾返回类型通常在函数定义的时候使用,而不是在函数声明的时候。

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

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

int foo(); 
auto foo() -> int;

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

task<typename details::_TaskTypeFromParam<_Ty>::_Type> create_task(_Ty _Param); 
auto create_task(_Ty _Param) -> task<typename details::_TaskTypeFromParam<_Ty>::_Type>;

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

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

template<typename T> 
T add(const T& x, const T& y) 
{ 
    return x + y; 
}

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

template<typename T, typename U> 
??? add(const T& x, const U& y) 
{ 
    return x + y; 
}

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

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

template<typename T, typename U> 
auto add(const T& x, const U& y) -> decltype(x + y) 
{ 
    return x + y; 
}

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


http://www.kler.cn/a/153208.html

相关文章:

  • 到底什么是yocto(yocto是什么)
  • Non-local KDE 如何应对类似于AIS的数据?
  • nodejs+vue+elementui网上家电家用电器数码商城购物网站 多商家
  • 【Android面试|华为|广播类】-Local Broaddcasts 能接收到系统广播么?
  • MySQL的系统信息函数
  • springboot+vue志愿者在线报名服务管理系统java毕业设计源码+数据库
  • MAMP Pro v6.8.1(PHP/MySQL开发环境)
  • Linux git
  • MySQL的数学函数
  • Unity | 渡鸦避难所-0 | 创建 URP 项目并导入商店资源
  • 目标检测VOC生成txt文件
  • Python 2进制按位取反
  • cocos 关于多个摄像机,动态添加节点的显示问题,需要动态修改layer。(跟随摄像机滚动)(神坑官网也不说明一下)
  • zookeeper集群和kafka集群
  • 关于web前端通过js获取后端mysql数据库数据的一个方法
  • MySQL 教程 1.4
  • 【实战教程】PHP如何轻松对接腾讯云COS,实现文件上传下载?
  • ffmpeg之QT开发环境搭建
  • JAXB的XmlValue注解
  • canvas基础:渲染文本