首页 > 其他分享 >左值有地址,为社么还要std::move()?

左值有地址,为社么还要std::move()?

时间:2024-08-01 17:06:43浏览次数:11  
标签:std 右值 move 左值 引用 移动

我把左值传入函数,左值有地址不是可以直接进行移动吗,为什么还要转为右值?

原因:一般函数都有设置左值引用的接口和右值引用的接口,右值就是为了传入参数后销毁原参数,左值引用就是为了保护原参数而进行深拷贝。所以一般想实现移动语义就用右值引用的接口。

在 C++ 中,移动语义的核心思想是通过右值引用来实现资源的转移。右值引用允许我们区分出那些可以安全地“偷走”资源的对象(即右值),从而避免不必要的拷贝操作。虽然左值有地址,但它们通常表示持久的、需要保留的对象,因此不能直接移动它们的资源。
为什么需要 std::move
1. 区分左值和右值:左值通常表示持久的对象,而右值表示临时对象或即将销毁的对象。通过将左值显式转换为右值引用,std::move 告诉编译器这个对象可以被“偷走”资源。
2. 启用移动语义:移动构造函数和移动赋值运算符是专门为右值引用设计的。只有当参数是右值引用时,这些函数才会被调用。

标签:std,右值,move,左值,引用,移动
From: https://www.cnblogs.com/cunyusup/p/18337040

相关文章

  • C++ - 左值和右值的区别
    示例:来看一行简单的代码1inta=10;这行代码,"="左边就是左值,"="右边的则为右值,那他们到底有什么不同呢?如果是Java、PHP等后端同学,会称以左边的"a"为变量,右边的"10"为字面量,而到了C++这里,我们就需要对他理解更多一点。这行代码运行起来,是在系统内存中申......
  • LeetCode | 27 RemoveElement
    https://github.com/dolphinmind/datastructure/tree/datastructure-array主类packagecom.github.dolphinmind.array.binarysearch;/***@authordolphinmind*@ClassNameRemoveElement*@description27移除元素*移除元素分析*快......
  • openEuler22.03系统安装Fastdfs
     1.下载依赖包离线状态下,先找一个可以连外网的机器,安装vmware,安装同版本的openEuler22.03系统后,下载依赖包yuminstall--downloadonly--downloaddir=/worklrzszyuminstall--downloadonly--downloaddir=/workg++yuminstall--downloadonly--downloaddir=/workzip......
  • 关于new、delete函数的错误处理(std::nothrow)
    new、delete函数源码注释如下:无参数无参数的new、delete函数,如果调用失败,会抛出bad_alloc异常,需要使用try{}catch(){}语句捕获异常从而进行异常处理。#include<iostream>intmain(){try{while(1){int*p=newint[100000000ul];......
  • unity报错CommandWithNoStdoutInvokationFailure: Unable to start ADB server.
    这个错误提示表明Unity无法启动ADB(AndroidDebugBridge)服务器,这通常是因为AndroidSDK没有安装或者配置不正确。以下是一些解决这个问题的步骤:确认AndroidSDK的安装:确保你已经安装了AndroidSDK。可以通过AndroidStudio来安装SDK,或者从Android开发者网站下载。配置U......
  • 为什么 Windows 上的 `os.execl` 会干扰 `stdin`?
    我的最小示例是null.py:importos,sysos.execl(sys.executable,sys.executable)我本以为pythonnull.py与运行python几乎相同,Ubuntu22.04上就是这种情况。然而,在Windows11上,它似乎会严重扰乱标准输入;例如,如果我按下一个键,它可能会也可能不会出......
  • 14 Python列表操作内置函数(append、+、extend、insert、index、del、pop、remove、len
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。   专栏:java全栈C&C++PythonAIP......
  • std::optional
    mutable在C++中,mutable关键字的主要作用是允许类的成员变量在常量成员函数中被修改。常量成员函数是用const关键字修饰的成员函数,通常不允许修改类的成员变量。然而,有时我们希望在这些常量成员函数中修改某些特定的成员变量,比如缓存、调试信息等。为了实现这一需求,可以使用mu......
  • std的map或者set中,比较浮点类型二维三维数据
    在map和set中,如果比较对象是二维或者三维数据,需要把二维三维数据的浮点数转换为比较精度。如果比较精度是0.001,那么数据的精度也必须是0.001,不然会出现如下情况:比较函数 structPoint001Comp{booloperator()(constPoint*l,constPoint*r)const{i......
  • C++ printf/std::cout如何重定向到日志文件中
    在C++中,可以使用标准库中的头文件提供的ofstream类来打开文件,并使用std::freopen函数将stdout重定向到该文件。以下是一个示例代码,展示如何将printf输出重定向到日志文件中:#include<cstdio>#include<fstream>intmain(){std::ofstreamlogFile("log.txt",std::ios:......