右值引用 右值 左值和 左值引用

2023-11-17

首先注意lvalue 和rvalue 中的l  r 不是 left和right

而是

l = locator value 可以寻址的数据,明确一定是一个地址容纳一个数据,可以在该条语句后面再找到这个值

r= read value  不可寻址数据或者用来读取的数据

右值引用 会得到一个左值

x++ 右值; (产生一个临时变量返回,然后x+1)

++x左值;(先x+1再返回x)

左值引用依然得到左值,就是起一个别名 符号是&

int a=10;

int &b=a;

此时 b和a地址在内存中是相同的。

右值引用得到一个左值,符号是 &&

可以理解为用一个变量去保存这个临时变量。对于类类型不用多次调用拷贝构造函数(主要用途)。

int && c=10 是可行的

所以得到的c是一个左值

这样写意义不大。但是对于一个类。

比如 class A 有一个+方法

A a,b

A c=a+b 和A &&c=a+b就有区别了。

第一种

A c=a+b  先调用 a+b产生了一个临时对象 temp. 然后再调用了拷贝构造函数 c=temp

第二种 A &&c=a+b就没有产生这个temp 而是直接用c去接受了这个 +的值 没有产生多的拷贝构造函数。

std::move干的就是这个事情。将一个左值转换成一个右值引用,减少拷贝,但是原。

#include

#include

#include

using namespace std;

int main()

{

    string str = "hello";

    cout << "before str: " << str << endl;

    vector vstr;

   vstr.emplace_back(std::move(str));

    cout << "after  str: " << str << endl;

    return 0;

}

比如这个move 将原来str的所有权转移直接变成了vstr的参数放进去。同时原str变成了空字符串。

这个类需要实现移动构造函数 移动赋值函数 A(A&& r)    A operator= (A&& r); 

一些使用的坑

c++的坑 -- 移动构造函数 和 移动赋值运算符 - 知乎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

右值引用 右值 左值和 左值引用 的相关文章

  • 为什么我的 C#/pinvoke DeviceIoControl 调用返回 0 字节读取的垃圾数据?

    我有一个运行良好的非托管 C Windows 控制台应用程序 我想要它在 C 中 我已经为必要的 Kernel32 dll 符号完成了 DllImport 语句 StructLayout LayoutKind Sequential inte
  • Windows 10 UWP 中的视觉状态管理器未在页面加载时应用初始状态

    我有一个带有相关面板的页面 可以根据宽度重新组织 但是 除非宽度 gt 720px 否则它似乎不会在加载时应用任何状态 如果我在加载页面后调整页面大小 则两种状态都有效 解决方法是检查加载页面上的窗口大小并手动选择状态 但我相信这应该自动处
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • PARITY_NONE 是 C++ Windows 中的关键字吗?

    我正在使用 boost 编写一个串行库 并且我有一个枚举 enum parity t PARITY NONE PARITY ODD PARITY EVEN 我收到如下错误 错误 1 错误 C2059 语法错误 我无法弄清楚问题是什么 然后我
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn
  • ASP.NET API:尚未为此 DbContext 配置数据库提供程序

    我正在尝试从我的 Net Core API 项目连接到 MySql 数据库 这是我的上下文类 public class MyContext DbContext public MyContext public MyContext DbCont

随机推荐

  • 获取微信步数

    获取微信步数 getWalkCounts function var that this wx login success res wx getWeRunData success res1 console log res1 if res1 e
  • Java项目:ERP管理系统(java+SpringBoot+EasyUI+maven+mysql)

    源码获取 博客首页 资源 里下载 项目介绍 系统主要功能包括 首页 零售管理 零售出库 零售退货 采购管理 采购订单 采购入库 采购退货 销售管理 销售订单 销售出库 销售退货 仓库管理 其它入库 其它出库 调拨出库 组装单 拆卸单 财务管
  • Maven 中启动 Tomcat,控制台打印信息出现乱码

    Tomcat 可以正常启动 但是控制台输出打印的是乱码 很多教程要修改 settings 中的 VM Options 或者 File Encodings 但我的配置都是正确的 最后发现是因为新版本 Tomcat 改用 utf8 编码输出日志
  • 嵌入式开发--SPI介绍和驱动开发

    目录 一 通信总线SPI介绍 二 SPI时序介绍和工作模式 三 基于stm32的spi初始化步骤 一 通信总线SPI介绍 SPI 全称为Serial Peripheral Interface 是一种同步的串行通信协议 SPI协议最初由Mot
  • 不使用第3个变量,实现两个数的对调

    任务描述 本关任务 下列程序是不用第三个变量 实现将两个数进行对调的操作 程序代码如下 1 include
  • Python中pip安装与使用及错误解决方案合集

    文章目录 前言 一 pip 安装与使用 二 pip安装错误解决方案合集 1 module包没安装 2 import缺失 3 init py文件缺失 4 安装的第三方module包的版本不对 5 import导错包 6 未设置PYTHONPA
  • ionic ajax数据,Ionic/Cordova - AJAX requests failing with status

    I am unable to get my AJAX requests working on an Ionic Cordova app deployed to iOS and Android I get the following reje
  • Unity C# 函数笔记

    寻找子对象的某个组件 public T FindTransform
  • 使用Thumbnails对图片进行压缩处理

    引入依赖
  • python case when用法,使用SQL的CASE WHEN / THEN语法进行排序django

    I m trying to order contacts in table and I m facing some problems I found a nice solution in this SO question maybe it
  • VB中实现ASP中Server.URLEncode与Server.URLDecode

    在HTTP协议中 浏览器不能向服务器直接传递某些特殊字符 就必须对这些字符进行URL编码再传送 浏览器一般会以 UTF 8 和 ANSI 当前系统语言设置 两种方式发送 URL 到服务器 例如 在 baidu 中搜索中国的结果 http w
  • 解决KEIL上的ST-LINK提示升级文件过大的问题

    我是阿荣 关注我 在技术路上一起精进 今天翻出了尘封已久的潘多拉STM32L4开发板 准备研究下LCD屏 结果在使用ST Link时 提示版本过旧 需要升级 然而升级包过大 不适合在STM32F103C8T6上升级 ST LINK Firm
  • [系统安全] 五十三.DataCon竞赛 (2)2022年DataCon涉网分析之恶意样本IOC自动化提取详解

    您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意代码检测 系统安全 系列文章会更
  • Android开发报错与解决

    一 AndroidStudio部署项目到设备时 出现以下报错 导致部署失败 Cause buildOutput apkData must not be null 或者 Cause buildOutput apkInfo must not b
  • 1054 求平均值 (20 分)2021/5/13

    本题的基本要求非常简单 给定 N 个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后 2 位 当你计算平均值的时候 不能把那些非法的数据算在内 输入格
  • 云计算基础入门

    文章目录 前言 一 大数据 1 大数据技术 基础技术 2 大数据技术的产生 3 大数据 4 大数据对科学研究产生的影响 第四范式 四种范式 5 大数据的4V特征 二 云计算 1 云计算模式 2 云计算定义 2 云计算的主要服务模式 3 三种
  • 【MySQL中对表的常见操作】 —— 第四天

    1 删除表的基础语法 drop table 表名 普通删除 drop table if exists 表名 先判断该表是否存在 2 向表中插入数据的基础语法 insert into 表名 字段1 字段2 字段n values 字段值 字段值
  • Python中的包管理方法

    在Python开发中 包管理与依赖问题一直是开发者头疼的问题之一 随着项目规模的增大和复杂性的增加 管理各种依赖包和解决版本冲突变得尤为重要 本文将分享解决Python中的包管理与依赖问题的方法和工具 帮助开发者更好地管理项目中的依赖关系
  • 单片机c语言的指针,单片机C语言指针的指针

    指针的指针 一个指针变量内部可以存储一个值 这个值是另外一个对象的地址 所以我们说一个指针变量可以指向一个普通变量 同样这个指针变量也有一个地址 也就是 说有一个东西可以指向这个指针变量 然后再通过这个指针变量指向这个对象 那么如何来指向这
  • 右值引用 右值 左值和 左值引用

    首先注意lvalue 和rvalue 中的l r 不是 left和right 而是 l locator value 可以寻址的数据 明确一定是一个地址容纳一个数据 可以在该条语句后面再找到这个值 r read value 不可寻址数据或者用