C++之左值、右值、std::forward、std::move总结(二百五十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之lambda匿名函数、typedef、using等用法

2.左值、右值功能介绍

1.C++左值、右值概念

  • C++中的左值(lvalue)和右值(rvalue)是表达式的属性,用于表示它们在赋值操作中的行为和特性。

  • 左值(lvalue)表示一个可以标识内存位置的表达式,它可以出现在赋值语句的左边或右边。左值可以被引用(可以取得其地址)并且在程序的生命周期中保持稳定。简而言之,左值可以出现在等号左边或右边,并且在其他表达式中可以被引用。

  • 右值(rvalue)表示一个临时的、无法标识内存位置的表达式,它只能出现在赋值语句的右边。右值不能被引用并且在表达式执行完成后可能会被销毁。右值通常是临时生成的中间结果或字面常量。

2.代码实例

  1. 左值示例:
int a = 5;  // 'a'是一个左值,可以在赋值语句的左边或右边使用int b = a;  // 'a'作为右值,它的值被赋给'b'int c = a + b;  // 'a'和'b'都是左值,可以在表达式中进行运算int* ptr = &a;  // 'a'的地址可以被引用
  1. 右值示例:
int result = 2 + 3;  // '2 + 3'是一个右值,表示一个临时的表达式结果int&& temp = 2 + 3;  // '2 + 3'作为右值引用存储在一个右值引用变量中int getValue();  // 函数返回一个右值int value = getValue();  // 函数返回的值是一个右值

3.std::move、std::forward功能介绍

1.std::move、std::forward概念

std::forwardstd::move是C++标准库中提供的两个函数模板,用于实现移动语义和完美转发(perfect forwarding)。它们在C++11引入的右值引用语法的基础上,提供了更灵活和高效的资源管理和函数参数传递方式。

    1. std::move函数:
    • std::move用于将一个左值(lvalue)转换为右值引用(rvalue reference),从而能够实现移动语义。
    • 它是通过使用静态转换static_cast来实现的,并且没有运行时开销。
    • std::move的主要作用是为了在移动语义的情况下,将资源的所有权从一个对象转移到另一个对象,避免了不必要的复制操作,提高了性能。
  • 2.std::forward`函数:

    • std::forward用于实现完美转发,将函数参数以原有的左值或右值引用方式传递,保持类型不变。
    • 它用于解决函数模板中传递参数的类型保持一致性的问题,能够将右值引用转发为右值引用,将左值引用转发为左值引用。
    • std::forward通过使用模板推导和引用折叠规则来实现。

2.代码实例

v1.0 std::move实例
#include <iostream>
#include <vector>
#include <string>using namespace std;int main(){//v1.0 std::move()用法.string buf1 = "123";//string&& Rval1 = buf1;//failed:将左值赋值给右值引用.string&& Rval3 = std::move(buf1);//std::move(): 将左值转为右值,赋值给右引用.cout << buf1 << endl; return 0;
}
v2.0 std::move实例
#include <iostream>
using namespace std;void test(int& x) {printf("xxx------>line = %d, 左值 = %d\n",__LINE__,x);
}void test(int&& x) {printf("xxx------>line = %d, 右值 = %d\n",__LINE__,x);
}template<typename T>
void foo(T&& arg) {test(std::forward<T>(arg));
}void test_1(int x){printf("xxx------>line = %d, 右值 = %d\n",__LINE__,x);
}void test_2(int& x){printf("xxx------>line = %d, 右值 = %d\n",__LINE__,x);
}int main() {//v1.0int x = 42;test_2(x);//OK:因为test_2接收的是左值,因为x为左值.//test_2(42);//报错:接收右值,因为test_2()只接收左值.//v2.0:不是设置参数的类型左值(int &)或右值(int &&),则可以接收左值或右值.int y = x + 1;test_1(x+1);//接收右值:x+1test_1(y);//接收左值:y//v3.0:通过forward完美左值或右值转换foo<>(x); //接收左值: xfoo<int>(42); //接收右值: 42return 0;
}

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

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

相关文章

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

react-高阶组件

一、什么是高阶组件 高阶组件&#xff08; Higher-Order Component&#xff0c;HOC &#xff09;是一个以组件作为参数&#xff0c;返回一个新组件的函数。 高阶组件最大的特点就是复用组件逻辑高阶组件本身并不是 React 的 API&#xff0c;而是React组件的一种设计模式&…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

windows下-mysql环境配置,以及使用navicat可视化数据库,便捷撰写sql语句。

文章目录 MySQL 连接到本地MySQL 下载MySQL连接基本SQL操作语句创建并查看数据库删除数据库修改数据库插入、删除、修改数据 图形化界面展示数据库 Navicat 基础操作连接本地的mysql数据库撰写sql语句 MySQL 连接到本地 MySQL 下载 直接系统自带应用商城下载&#xff0c;安装最…

MySQL 多表查询 事务 索引

目录 多表查询简介内连接查询 join on外连接查询 left join、right join子连接查询标量子查询列子查询 (in、not in)行子查询表子查询 多表查询案例 事务事务介绍操作 start transaction、commit、rollback事务四大特性(面试题) 索引索引介绍索引原理索引语法 index 上次学习了…

【高阶数据结构】并查集和图

目录 1.数据结构--并查集 2.数据结构--图 1.图的基础概念 2.图的简单实现 2.1.邻接矩阵的图实现 2.2.邻接表的图实现 2.3.图的DFS和BFS 2.4.最小生成树 2.4.1.Kruskal(克鲁斯卡尔算法) 2.4.2.Prim&#xff08;普里姆算法&#xff09; 2.5.最短路径 2.5.1.Dijkstra(…

soc的复位reset/rst问题

本节不去讨论同步复位与异步复位以及异步复位的reset_release&#xff0c;这些问题可参考&#xff1a;芯片设计进阶之路——Reset深入理解——cy413026 本机主要回答一下几个问题。 1.片外的reset信号特别是按键reset怎么防止错误抖动的影响&#xff1f; 常见的处理方法包括两…

大数据-Storm流式框架(三)--Storm搭建教程

一、两种搭建方式 1、storm单节点搭建 2、完全分布式搭建 二、storm单节点搭建 准备 下载地址&#xff1a;Index of /dist/storm 1、环境准备&#xff1a; Java 6 Python 2.6.6 2、上传、解压安装包 3、在storm目录中创建logs目录 mkdir logs 启动 ./storm help …

解决cloudflare pages部署静态页面发生404错误的问题

cloudflare pages是一个非常方便的部署静态页面的sass工具。 但是很多人部署上去以后&#xff0c;访问服务会报404错误。什么原因&#xff1f; 原因如下图所示&#xff1a; 注意这个Build output directory, 这个是部署的关键&#xff01; 这个Build output directory目录的…

ETL工具Kettle

1 Kettle的基本概念 一个数据抽取过程&#xff0c;主要包括创建一个作业&#xff08;Job&#xff09;&#xff0c;每个作业由一个或多个作业项&#xff08;Job Entry&#xff09;和连接作业项的作业跳&#xff08;Job Hop&#xff09;组成。每个作业项可以是一个转换&#xff…

TSINGSEE青犀基于AI视频识别技术的平安校园安防视频监控方案

一、背景需求 因学校频频出治安事件&#xff0c;所以必须要加强学校的安防工作&#xff0c;目前来看&#xff0c;大部分校园都建设了视频监控来预防保障校园安全。但是传统的视频监控系统&#xff0c;主要通过设备来录像以及人员时时监控来进行。这种监管方式效率十分低下&…

使用canal实现数据实时同步

canal canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigger…

【API篇】八、Flink窗口函数

文章目录 1、增量聚合之ReduceFunction2、增量聚合之AggregateFunction3、全窗口函数full window functions4、增量聚合函数搭配全窗口函数5、会话窗口动态获取间隔值6、触发器和移除器7、补充 //窗口操作 stream.keyBy(<key selector>).window(<window assigner>)…

lesson2(补充)关于const成员函数

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 将const 修饰的 “ 成员函数 ” 称之为 const 成员函数 &#xff0c; const 修饰类成员函数&#xff0c;实际修饰该成员函数 隐含的 this 指针 &#xff0c;表明在该成员函数中不能对类的任何成员进行修改…

Vue+ElementUI项目打包部署到Ubuntu服务器中

1、修改config/index.js中的assetsPublicPath: /,修改为assetsPublicPath: ./ assetsPublicPath: ./2、在build/utils.js中增加publicPath: ../../ publicPath: ../../3、打开终端&#xff0c;在根目录下执行npm run build进行打包&#xff0c;打包成功后会生成dist npm run…

037-第三代软件开发-系统音量设置

第三代软件开发-系统音量设置 文章目录 第三代软件开发-系统音量设置项目介绍系统音量设置QML 实现C 实现 总结一下 关键字&#xff1a; Qt、 Qml、 volume、 声音、 GPT 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Obj…

听GPT 讲Rust源代码--library/std(8)

题图来自Why is Rust programming language so popular?[1] File: rust/library/std/src/sys/sgx/abi/reloc.rs 在Rust源代码中&#xff0c;sgx/abi/reloc.rs文件的作用是定义了针对Intel Software Guard Extensions (SGX)的重定位相关结构和函数。 该文件中的Rela 结构定义了…

集群节点批量执行 shell 命令

1、SSH 工具本身支持多窗口 比如 MobaXterm&#xff1a; 2、编写脚本通过 ssh 在多台机器批量执行shell命令 创建 ssh_hosts 配置文件&#xff0c;定义需要批量执行的节点&#xff08;必须能够通过 ssh 免密登录&#xff0c;且存在同名用户&#xff09; vim ssh_hostsbig…

Oracle通过透明网关查询SQL Server 报错ORA-00904

Oracle通过透明网关查询SQL Server 报错ORA-00904 问题描述&#xff1a; 只有全表扫描SELECT * 时SQL语句可以正常执行 添加WHERE条件或指定列名查询&#xff0c;查询语句就报错 问题原因&#xff1a; 字段大小写和SQLSERVER中定义的不一致导致查询异常 解决办法&#xff1a; 给…

消息队列中间件面试笔记总结RabbitMQ,Kafka,RocketMQ

文章目录 (一) Rabbit MQRabbitMQ 核心概念消息队列的作用Exchange(交换器)Broker&#xff08;消息中间件的服务节点&#xff09;如何保证消息的可靠性如何保证 RabbitMQ 消息的顺序性如何保证 RabbitMQ 高可用的&#xff1f;如何解决消息队列的延时以及过期失效问题消息堆积问…