【C++11保姆级教程】新的函数声明(trailing return type)、右值引用(rvalue references)

news2024/11/18 19:04:25

文章目录

  • 前言
  • 一、新的函数声明(trailing return type)
    • 1.1新的函数声明(trailing return type)概念
    • 1.2新的函数声明的使用
  • 二、右值引用(rvalue references)
    • 2.1右值引用(rvalue references)概念
    • 2.2右值引用使用
  • 总结


前言

C++11标准引入了一些重要的新特性,其中包括新的函数声明和右值引用。本篇文章旨在通过通俗易懂的方式解释这两个概念,并为读者提供一些有趣的比喻来帮助理解。带你逐步了解这些概念。


一、新的函数声明(trailing return type)

1.1新的函数声明(trailing return type)概念

在C++11之前,函数的返回类型必须紧跟在函数名称后面。这种写法在函数的参数列表复杂或函数声明较长时,会导致可读性下降。为了解决这个问题,C++11引入了新的函数声明语法,也被称为"trailing return type"。

1.2新的函数声明的使用

新的函数声明允许我们将返回类型放在函数体后面,使用"auto"关键字来推导返回类型。下面是一个使用新的函数声明方式的加法函数示例:

auto add(int a, int b) -> int {
    return a + b;
}

通过使用这种形式的函数声明,我们更清晰地看到函数的参数列表和返回类型,提高了代码的可读性。尤其是在模板函数的情况下,新的函数声明语法可以方便地处理复杂的类型推导。
在这里插入图片描述
在这里插入图片描述

通过前面的decltype我们可以改写出下面的代码:

template <typename T>
auto add(T a,T b) -> decltype(a + b)
{
    return a + b;
}
cout << add(10, 20) << endl;
cout << add(10.8, 20.99) << endl;
cout << add<char>(0, '0') << endl;

在这里插入图片描述

输出结果
在这里插入图片描述

二、右值引用(rvalue references)

2.1右值引用(rvalue references)概念

右值引用是C++11引入的一个重要概念,用于引用即将被销毁的临时值。为了更好地理解右值引用,我们首先需要了解左值和右值的概念。

左值是表达式或对象的持久性实体,可以被取地址。例如,变量和具名对象都是左值。右值则是临时的、即将被销毁的值,它们没有持久的标识符,无法被取地址。右值可以是字面量、临时对象或表达式的结果。

可以通过一个简单的比喻来理解左值和右值的区别。假设你有一套房子,那么房子就是左值,你可以长期占有并对其进行修改。而当你住进一间旅馆时,旅馆房间就是右值,你只是短暂地使用它,无法对其进行长期占有或修改。

2.2右值引用使用

右值引用的语法使用"&&"表示,例如:

int&& rvalueRef = 42;

在这个例子中,我们声明了一个名为"rvalueRef"的右值引用,并将其绑定到一个临时创建的整数值42。由于42是一个临时值,它将在语句结束后被销毁。通过右值引用,我们可以对这个临时值进行操作、使用和传递,而无需进行不必要的数据拷贝,提高了性能和效率。

基础操作:

int&& a = 42;
a = 52;
cout << a << endl;

输出:
在这里插入图片描述

右值引用的一个重要应用是在移动语义中。C++11还引入了"std::move"函数,可以将一个左值转换为右值引用,用于支持资源的高效转移和移动语义的实现。这在处理大型对象或者进行资源密集型操作时尤为重要,可以显著提升程序的性能和效率。

std::move在后期的C++11课程中会讲到,请关注我,获取最新文章吧!!!


总结

在这个例子中,我们声明了一个名为"rvalueRef"的右值引用,并将其绑定到一个临时创建的整数值42。由于42是一个临时值,它将在语句结束后被销毁。通过右值引用,我们可以对这个临时值进行操作、使用和传递,而无需进行不必要的数据拷贝,提高了性能和效率。

右值引用的一个重要应用是在移动语义中。C++11还引入了"std::move"函数,可以将一个左值转换为右值引用,用于支持资源的高效转移和移动语义的实现。这在处理大型对象或者进行资源密集型操作时尤为重要,可以显著提升程序的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[机器学习]特征工程:特征降维

特征降维 1、简介 特征降维是指通过减少特征空间中的维度&#xff0c;将高维数据映射到一个低维子空间的过程。 在机器学习和数据分析中&#xff0c;特征降维可以帮助减少数据的复杂性、降低计算成本、提高模型性能和可解释性&#xff0c;以及解决维度灾难等问题。特征降维通…

机器学习知识点总结:什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

实战项目:基于主从Reactor模型实现高并发服务器

项目完整代码仿mudou库one thread one loop式并发服务器实现: 仿muduo库One Thread One Loop式主从Reactor模型实现⾼并发服务器&#xff1a;通过模拟实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。并且&#xff0c;通过组件内提供的不同应⽤层…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足&#xff0c;需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站&#xff1a; https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

如何利用Simulation模拟零件受到的冲击力

线性静力载荷作用过程是恒定的&#xff0c;不随时间变化&#xff1b;单冲击力载荷作用的时间很短&#xff0c;高速高能量&#xff1b;今天给大家分享的是Simulation怎么模拟零件受到冲击力。 DEMO案例介绍&#xff1a;板材规格250X120X10&#xff0c;在板材的中心Φ5的区域受冲…

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…

【T3】畅捷通T3凭证预览/打印摘要和凭证中看到的摘要不一样。

【问题描述】 畅捷通T3软件中&#xff0c; 凭证打印预览以及打印出来的效果和直接在凭证界面看到的该凭证摘要不一致。 【解决方法】 执行下述清除凭证摘要特殊字符和空格的语句后&#xff0c;重新预览打印。 update GL_accvouch set cdigestREPLACE(cdigest,CHAR(9),) whe…

找pr剪辑素材就上这6个网站,免费可商用。

视频剪辑没素材&#xff0c;就上这几个网站找&#xff0c;免费、付费、商用素材全都有&#xff0c;最重要的是高清、4K无水印&#xff0c;赶紧马住了。 潮点视频 https://shipin520.com/?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

2003-2022年高铁站开通时间

2003-2022年高铁站开通时间 1、时间区间&#xff1a;2003-2022年 2、指标如下&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 指标说明&#xff1a;Hsrwsnm[高铁站名称]-高铁站名称 Optm[开通时间]-高铁站开通的时间 Prvn[所在省份]-高…

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…

【Web 表单】与用户数据打交道-2(mdn笔记)

8. UI 伪类 8.1 都有什么样的伪类&#xff1f; 我们可以使用的&#xff08;截至 CSS 2.1&#xff09;与表单相关的原始伪类是&#xff1a; :hover&#xff1a;只在鼠标指针悬停在一个元素上时选择该元素。:focus&#xff1a;只在元素被聚焦时选择该元素&#xff08;也就是说&am…

绘制 PCA 双标图和碎石图

1、双标图 import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn import datasets# data np.random.random((1000,10)) # y np.random.randint(0,6,1000)iris datase…

C# WPF 无焦点自动获取USB 二维码扫码枪内容,包含中文

C# WPF 无焦点自动获取USB 二维码扫码枪内容&#xff0c;包含中文 前言项目背景 需要预知的知识实现方案第一步 安装键盘钩子第二步 获取输入的值第3 步 解决中文乱码问题分析解决思路工具函数 结束 前言 USB接口的扫码枪基本就相当于一个电脑外设&#xff0c;等同于一个快速输…

Jmeter数据驱动 —— csv高效用例

目录 1、设置测试用例&#xff0c;创建用例数据文件&#xff1a;testcase.csv 2、新建一个线程组&#xff0c;命名为&#xff1a;数据驱动&#xff0c;添加配置元件-HTTP请求默认值&#xff0c;配置好IP地址和端口号 3、添加逻辑控制器-循环控制器。循环控制器的作用可以控制…

IDEA中导出Javadoc遇到的GBK编码错误的解决思路和应用

IDEA中导出Javadoc遇到的GBK编码错误的解决思路和应用 ​ 当我们在导出自己写的项目的api文档的时候呢&#xff0c;有的时候会出现以下问题&#xff1a;也就是GBK编码错误不可导出 错误描述&#xff1a;编码GBK的不可映射字符无法导出&#xff0c;可以看出这是我们自己写的中文…

移动app软件安全性测试内容有哪些?专业移动app测试报告获取

移动app软件安全性测试报告是评估和验证移动应用程序在设计和开发过程中是否具有足够的安全性措施。在当今移动应用程序的高度发展和普及中&#xff0c;保护用户的个人数据和信息安全至关重要。 一、移动app软件安全性测试包括的内容 1、权限访问测试&#xff1a;测试app获取…

【BIOS】Bios设置通电即自动开机。

【问题需求】 设置电脑/服务器接通电源后&#xff0c;自动开机。 【解决方案】 不同主板的bios设置不一样&#xff0c;但方向都差不多。 在此整理一些不同准版bios的设置方法。 【通用主板Bios】 开机后连续按del键&#xff0c;进入Bios。 切换到【Advanced】菜单下&#xff…

【STM32学习】搭建一个简单的 keil5 工程

一、安装 pack 支持包 pack是支持包文件&#xff0c;当你的板子连接到电脑时&#xff0c;keil5 怎么知道你的板子是哪个型号的&#xff0c;这就需要用到 pack 文件了。Keil 官方下载pack文件的地址&#xff1a;download | device pack 我这里使用的是 STM324 系列 随后直接一…

Nginx运行Vue项目:基本运行

需求 在Nginx服务器中&#xff0c;运行Vue项目。 说明 Vue项目打包生成的生产文件&#xff0c;是无法直接在浏览器打开的。需要放到Nginx服务器中&#xff0c;才能够访问。 本文章只介绍最基本的情况&#xff1a;Nginx中运行一个Vue项目。 实际生产环境&#xff0c;一个Ng…