C++:深入理解C++11新特性:Chapter3:左值和右值

news2024/11/29 4:50:36

Chapter3:左值和右值

  • 1. 将右值绑定到 左值
  • 2. 将右值绑定到 常量左值引用
  • 3. 将右值绑定到右值引用
  • 总结:
  • 5. 左值,右值和右值引用
  • 6. 引用类型可以引用的值

在C语言中,我们常常会提起左值(lvalue),右值(rvalue)这样的称呼,而在编译程序时,编译器有时也会报出错误信息中包含 左值,右值说法。不过左值、右值通常不是通过一个严谨的定义而为人所知。下面我通过这样一个例子,来引导大家认识: 左值,右值,左值引用,右值引用,常量左值引用

#include<iostream>

struct Copyable{
	Copyable() {
		std::cout<< "copied...." << std::endl;
	}
	Copyable(const Copyable &copy)
	{
		std::cout<< "copied" << std::endl;
	}
};

Copyable ReturnRvalue()
{
	// 这是返回的 右值  
	return Copyable();
}

// 1. 接收右值表达式
void AcceptValue(Copyable copy)
{
	
}

// 2. 右值引用减少对象开销,并延迟对象生命周期
//  直观意义:为临时变量续命,也就是为右值续命,因为右值在表达式结束后就消亡了,
// 如果想继续使用右值,那就会动用昂贵的拷贝构造函数。
void AcceptRef(Copyable && copy)
{
	
}

// 3. 常量左值引用减少对象开销,并延迟对象生命周期
void AcceptRef_2(const Copyable& copy){}

int main()
{
	Copyable copy;
	std::cout << "Pass by value:" << std::endl;
	AcceptValue(ReturnRvalue());
	
	std::cout << "Passs by reference: " << std::endl;
	AcceptRef(ReturnRvalue());
	
	std::cout << "Passs by reference_2: " << std::endl;
	AcceptRef(ReturnRvalue());
}
// 打印结果:
copied.....

Pass by value:
copied.....

Passs by reference:
copied.....

Passs by reference_2:
copied.....
	

上面的例子:我们用到了

  1. 函数形参为左值,然后将右值表达式作为实参绑定到左值
  2. 函数形参为右值引用,然后将右值作为实参绑定右值引用
  3. 函数形参为常量左值引用,然后将右值作为实参绑定到 常量左值引用

1. 将右值绑定到 左值

在这里插入图片描述
💚💚 这种绑定方式的特点:

  1. 函数 ReturnRvalue() 在运行结束后,返回值(右值临时变量)复制一份作为实参传递给 AcceptValue() 函数后就不会存活下去了。
    这样会导致:Copyable 这个对象构建两次。浪费内存。

2. 将右值绑定到 常量左值引用

在这里插入图片描述

💚💚

  1. AcceptRef使用了引用传递,在 以 ReturnRvalue 返回的右值为参数的时候,AcceptRef 就可以直接使用产生的临时值(并延长其生命周期)。
  2. 这个临时值的生命周期就和 AcceptRef() 生命周期一致

3. 将右值绑定到右值引用

在这里插入图片描述
💚💚

  1. AcceptRef使用了引用传递,在 以 ReturnRvalue 返回的右值为参数的时候,AcceptRef 就可以直接使用产生的临时值(并延长其生命周期)。
  2. 这个临时值的生命周期就和 AcceptRef() 生命周期一致。

总结:

🧡 通过上面三个小节,我们总结了 将右值绑定到 :左值,常量左值引用,右值引用的情况,下面以这个为例子,分析左值、右值含义,通常情况下,哪些是左值哪些是右值。

5. 左值,右值和右值引用

在这里插入图片描述

6. 引用类型可以引用的值

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

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

相关文章

数组--part 5--螺旋矩阵(力扣59/54)(剑指offer 29)

文章目录 基本算法思想leetcode 59 螺旋矩阵 IIleetcode 54 螺旋矩阵剑指Offer 29 顺时针打印矩阵 基本算法思想 建议先去把题目看了&#xff0c;再来思考相关的代码。 错误的想法&#xff1a;实际上这种题型并不存在算法&#xff0c;只涉及到模拟&#xff0c;但是模拟难度并…

【51单片机】外部中断

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Love Story】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;原理 &#x1f354;注意管…

未来的数字签名方案:Dilithium、FALCON 和 SPHINCS+

1. 引言 当前的数字签名方案主要有&#xff1a; RSAECDSAEdDSA&#xff1a;已废弃DSA&#xff0c;将EdDSA纳入FIPS 186。 这些数字签名方案都不可抗量子攻击。为此&#xff0c;需要新的量子强健的签名方案&#xff0c;NIST引入了3种新的PQC数字签名标准化方案&#xff1a; …

软考A计划-真题-分类精讲汇总-第八章(面向对象)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【CSS基础】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、CSS是什么&#xff1f; 语法规范 引入方…

基于matlab使用主动声纳系统进行水下目标检测

一、前言 此示例演示如何模拟具有两个目标的主动单基地声纳方案。声纳系统由各向同性投影仪阵列和单个水听器元件组成。投影仪阵列呈球形。反向散射信号由水听器接收。接收到的信号包括直接和多路径贡献。 二、水下环境 在浅水环境中&#xff0c;声源和目标之间存在多个传播路径…

网络工程师常用命令排行榜,Ping就在这一行

大家好&#xff0c;我是老杨。 如果问你&#xff0c;你在日常工作中用的最频繁的命令是哪个&#xff0c;你下意识的第一反应是什么。 年前&#xff0c;我做了个不完全统计&#xff0c;大概有100多位粉丝参与的问卷调查&#xff0c; 调查每一位网工在解决网络故障时使用最多的…

[PCIE703]FPGA实时处理器-XCKU060+ARM(华为海思视频处理器-HI3531DV200)高性能综合视频图像处理平台设计资料及原理图分享

板卡概述 PCIE703是自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台&#xff0c;该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#x…

基于matlab编程的线性规划整数解问题求解

背景&#xff1a; 自己读研期间曾经用matlab做过一些小项目和实验&#xff0c;自己的毕业论文实验仿真也是用的matlab&#xff0c;最近打算更换电脑&#xff0c;在翻阅电脑磁盘的时候找到了一些和matlab相关的代码和文档&#xff0c;简单整理和分享一下。 说明&#xff1a; …

Dubbo——微服务框架(单体式->分布式->微服务)

是什么&#xff1f; Dubbo是阿里巴巴开源的基于Java的高性能RPC&#xff08;一种远程调用&#xff09;分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案&#xff0c;它提供了三大核心能力&#xff1a;面向接口的远程…

别让你的云端“瘫痪”——教你如何优化云平台性能测试

目录 引言 目的 测试指标 系统性能指标 资源指标 中间件指标 数据库指标 稳定性指标 批量处理指标 可扩展性指标 可靠性指标 性能测试的过程 测试计划 性能测试项目检测与控制 测试分析 测试设计 测试执行 测试完成 性能分析 性能分析的前提 性能分析的流…

一篇文章让你轻松通过佛科院的电子线路CAD考试——Altium Designer 14原理图设计与PCB设计(叶林朋著)

第一章 考试大纲 通过多次作业练习&#xff0c;我得出了完成一个完整的考试流程&#xff1a; 首先先创建PCB工程&#xff0c;查找一下元件&#xff0c;看一下哪些元件需要我们自己画创建元件集成库&#xff0c;画原理图元件和封装导入所有元件后&#xff0c;按照题目所给的图进…

Springboot源码:自动装配流程解析

前言 前面在写业务框架后&#xff0c;由于项目依赖的Spring IOC&#xff0c;单将该项目install后&#xff0c;在其它项目引入时&#xff0c;会找不到所依赖的Bean。所以利用Springboot的自动转配&#xff0c;在项目启动时加载Bean&#xff0c;并注册到IOC容器中。 Springboot…

node笔记_连接mysql编写js脚本的crud

文章目录 ⭐前言⭐mysql的api依赖库⭐建立数据库连接⭐query执行sql语句&#x1f496; create 新增table数据库表&#x1f496; insert 插入表数据插入单条数据插入多条数据 &#x1f496; select 查询数据&#x1f496; delete 删除表数据删除单条数据删除多条数据 ⭐ 结束 ⭐…

prometheus实战之五:飞书通知告警

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 《prometheus实战》系列链接 prometheus实战之一&#xff1a;用ansible部署prometheus实战之二&#xff1a;使用常见指标prometheus实战之三&#xff1a;告警…

Day968.如何开启一个遗留系统现代化项目? -遗留系统现代化实战

如何开启一个遗留系统现代化项目&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何开启一个遗留系统现代化项目&#xff1f;的内容。那如何启动一个遗留系统现代化项目。 一、项目背景 说来有点唏嘘&#xff0c;国内遗留系统的重灾区&#xff0c;恰恰…

MongoDB概念和操作

一、相关概念 在mongodb中最基本的概念为&#xff1a;文档、集合、数据库 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持prima…

Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

在 《Cordova webapp实战开发&#xff1a;&#xff08;4&#xff09;Android环境搭建》中我们搭建好了开发环境&#xff0c;也给大家布置了调用插件的预习作业&#xff0c;做得如何了呢&#xff1f;今天我们来学一下如何自己从头建立一个Andorid下的cordova插件。 本次练习你能…

【大腹太卷】一篇文章带你了解校招的神秘面纱

校招求职复盘 写在前面方向确定前置工作就业信息获取简历制作简历投递 笔面试工作测评笔试面试八股文自我介绍项目相关HR面试反问环节 Offer选择写在后面 写在前面 2023届应届生&#xff0c;去年的时候参加了校招&#xff0c;一路走来&#xff0c;感慨良多&#xff0c;特此记录…

蚊香液、蚊香片、蚊香盘的优缺点

夏天来了&#xff0c;蚊子也出来活动了&#xff0c;又到了消灭蚊子的季节。     蚊子是凭借人所呼出的二氧化碳和带气味的气体&#xff0c;来定位人的位置&#xff0c;进而叮咬人的皮肤。     蚊子吸人血&#xff0c;主要是利用血液里的胆固醇、B族维生素&#xff0c;促进蚊…