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

news2024/12/28 5:11:42

简介: 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.0
  int 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+1
  test_1(y);//接收左值:y

  //v3.0:通过forward完美左值或右值转换
  foo<>(x); //接收左值: x
  foo<int>(42); //接收右值: 42
  return 0;
}


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

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

相关文章

033-第三代软件开发-固定区域截图

第三代软件开发-固定区域截图 文章目录 第三代软件开发-固定区域截图项目介绍固定区域截图QWidget 版本QML 版本 自由截图自由截图二 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…

粤嵌实训医疗项目--day03(Vue + SpringBoot)

往期回顾 粤嵌实训医疗项目day02&#xff08;Vue SpringBoot&#xff09;-CSDN博客 粤嵌实训医疗项目--day01&#xff08;VueSpringBoot&#xff09;-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能&#xff08;文件上传&#xff09; 三、用户模块-注册实现…

基于stm32的ADC读取烟雾报警器的数值

本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高&#xff0c;他的电压就越高&#xff0c;但是不会超过3.3V。设置一个电压临界值&#xff0c;当传输回来的电压…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一&#xff1a;基于LaTeX环境方案二&#xff1a;基于KaTeX(推荐) 方案三&#xff1a;基于Matplotlib写在最后 引言 近来&#xff0c;涉及到一些公式识别的项目&#xff0c;输入是公式的图像&#xff0c;输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验&#xff0c;避免商家总是要在众多的配送公司中选择想要&#xff0c;小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处&#xff0c;指定需要设置的首选…

如何使用gpt提高效率

如何使用gpt提高效率 自动化替代人力工作减少创意工作需求技术依赖风险实际应用领域内容生成自动回答问题自动化编程个性化推荐 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&…

Linux进程控制(一)

前言&#xff1a;Linux进程控制是指在Linux操作系统中&#xff0c;对进程的创建、运行、管理和终止等方面进行控制的一系列机制和技术。Linux作为一个多任务操作系统&#xff0c;能够同时运行多个进程任务的执行&#xff0c;继前面我们对Linux进程创建的学习之后&#xff0c;今…

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a; 如何实现线程同步&…

Linux touch命令:创建文件及修改文件时间

既然知道了如何在 Linux 系统中创建目录&#xff0c;接下来你可能会想在这些目录中创建一些文件&#xff0c;可以使用 touch 命令。 需要注意的是&#xff0c;touch 命令不光可以用来创建文件&#xff08;当指定操作文件不存在时&#xff0c;该命令会在当前位置建立一个空文件&…

“第五十三天”

今天没有做什么&#xff0c;不过这个在打印&#xff0c;的时候一直卡着&#xff0c;我一直在想把逗号打印在后面&#xff0c;所以一直想办法确定最后一个是哪一位&#xff0c;这里居然没有绕过来其实可以看做是前面&#xff0c;这样第一个不打印逗号&#xff0c;后面打印就可以…

【笔录】TVP技术沙龙:寻宝AI时代

目录 引言大模型的应用案例大模型三问模型落地可行性考量维度AIGC的几个可行应用方向 引言 大模型是10倍的机会&#xff0c;但并不是平均主义的机会&#xff0c;没有低垂的果实。 企业想在大模型的赛道上跑出成绩&#xff0c;应该怎么做&#xff0c;又要选择哪些赛道&#xff1…

postgresSQL 数据库本地创建表空间读取本地备份tar文件与SQL文件

使用pgAdmin4&#xff0c;你安装PG得文件夹****/16/paAdmin 4 /runtime/pgAdmin4.exe 第一步&#xff1a;找到Tablespaces 第二步&#xff1a;创建表空间名称 第三步&#xff1a;指向数据文件 第四步&#xff1a;找到Databases&#xff0c;创建表空间 第五步&#xff1a;输入数…

矩阵按键简单使用

1、写矩阵按键&#xff08;下面在按这个格式把别的行也写入进去&#xff09; 2、在LCD中显示

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

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中&#xff0c;kernel_copy.rs文件位于sys/unix目录下&#xff0c;其主要作用是实现特…

全志T113-S3 裸机SMHC eMMC读写问题记录

由于全志的资料实在太少&#xff0c;很多只能通过很长时间测试才能知道问题&#xff0c;目前还没有实现时钟初始化&#xff0c;只使用了默认的24MHz时钟&#xff0c;测试eMMC读写过程中遇到2个问题&#xff1b; 问题1&#xff1a;读取扇区的时候&#xff0c;会遇到数据停止位错…

python 笔记:h5py 读取HDF5文件

1 HDF5文件 HDF5 是 Hierarchical Data Format version 5 的缩写&#xff0c;是一种用于存储和管理大量数据的文件格式一个h5py文件可以看作是 “dataset” 和 “group” 二合一的容器 dataset : 数据集&#xff0c;像 numpy 数组一样工作group : 包含了其它 dataset 和 其它 …

双11数码好物盘点、实用不踩坑的数码好物推荐

每年的双11都是买数码产品的最佳时间&#xff0c;因为很多外设产品的在双11都有很不错的降价空间&#xff0c;今天就列出几款适合双11购买的数码产品吧&#xff01; 1、不用入耳佩戴的开放式耳机 -官方售价&#xff1a;199 推荐理由&#xff1a; 要推荐的是这款健康舒适的开…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-屏幕监控

红队专题 招募六边形战士队员[24]屏幕监控-(1)屏幕查看与控制技术的讲解图像压缩算法图像数据转换其他 [25]---屏幕监控(2)查看屏幕的实现 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [24]屏幕监控-(1)屏幕查看与控制技术的讲解 屏幕…

分布式锁-Redis红锁解决方案

一 分布式锁的概念 1&#xff1a;概念 分布式锁&#xff08;多服务共享锁&#xff09; 在分布式的部署环境下&#xff0c;通过锁机制来让多客户端互斥的对共享资源进行访问控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共…

Oracle数据库设置归档模式(超级简单)

1、打开监听 查看监听的状态&#xff0c;如果没打开监听需要打开监听&#xff0c;如果打开直接下一步 lsnrctl status 打开监听 lsnrctl start 2、启动数据库 首先进入数据库 sqlplus /nolog 然后连接管理员 conn / as sysdba 3、查看当前模式 archive log list 可以…