什么是左值,什么是右值

常见的误区有 = 左边的是左值,右边的是右值。

左值:具有存储性质的对象,即lvalue对象,是指要实际占用内存空间、有内存地址的那些实体对象,例如:变量(variables)、函数、函数指针等。

右值:相比较于lvalue就是所谓的没有存储性质的对象, 也就是临时对象。

在c++中,临时对象不能作为左值,但可以作为常量引用const &

 ++i = 3;  // ok
i++ = 3; // error C2106: “=”: 左操作数必须为左值

++i:i先自增1,++i之后还是指向i的对象 
i++:先把i自增之后的值丢给一个临时变量,i++之后指向的是那个临时变量。如果放在单条语句中,这两个没啥区别。

int i = 0;  // 在这条语句中,i 是左值,0 是临时值,就是右值。
在C++11之前,右值是不能被引用的,如:
int &a = 1; // error C2440: “初始化”: 无法从“int”转换为“int &” const int &a = 1;//我们最多只能用常量引用来绑定一个右值,如:
int &&a = 1;//在C++11中,我们可以引用右值,使用&&来实现:

常量引用可以绑定一个右值,但缺点是这个值不能改变。

右值引用&&

c++中临时对象可能会大量存在,比如string/STL调用中。临时对象中的资源(buffer或者字符串)会随着临时对象的析构而消失,所以一般会在对象析构前把它们(资源)拷贝出来,而不会直接引用这些资源,否则会野指针。

其实,既然已经是临时对象了,马上就会被析构掉,所以赶在析构前改一下里面的内容也不会带来太多负面影响,当然是在控制良好的前提下。基于这个思路,我们可以放心大胆的直接引用临时对象中的资源指针(比如指针赋值,引用该资源),然后把它置空(防止被临时对象释放掉),或者更屌一点的,把我们意图释放的指针,直接赋值给临时对象的该指针,借助临时对象在析构时会释放它的资源的时机,把我们想释放的东西给释放掉!

多么精妙!

在c11之前,临时对象只能以 const MyClass& my_object 这种方式传递,有const在,所以临时对象是不能被修改的。但是c11引入了右值引用 MyClass&&,导致我们可以修改临时变量了!

假如你是函数的提供者,你提供了带右值引用的参数,那么,你就大胆的去引用它的资源,修改它的资源吧,不用担心它还会被使用到,当函数返回之后。因为它是右值引用,该函数的调用者会保证这个参数不会再被使用到。

假如你是函数的调用者,当你发现你有一个左值对象my_object即将不再被使用到了,就可以用move语义把它转成右值引用丢给函数,任函数去修改它的内容无所谓,因为你确定它不再被使用了(如果你确定不了,那就不能使用move语义)。当然,假如你处理的已经是右值了(比如函数返回值),那就跟以前没什么两样。

右值引用的意义何在

  • 右值引用是用来支持转移语义的。
  • 转移语义可以将资源 (堆,系统对象等)从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。
  • 临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。
  • 转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝

有了右值引用和转移语义,我们在设计和实现类时,对于需要动态申请大量资源的类,应该设计转移构造函数和转移赋值函数,以提高应用程序的效率。

(1)参数(右值)的符号必须是右值引用符号,即“&&”。

(2)参数(右值)不可以是常量,因为我们需要修改右值。

(3)参数(右值)的资源链接和标记必须修改。否则,右值的析构函数就会释放资源。转移到新对象的资源也就无效了。

先记录这么多,等以后有机会再深入总结。

C++11特性-右值引用的更多相关文章

  1. C++11之右值引用(二):右值引用与移动语义

    上节我们提出了右值引用,可以用来区分右值,那么这有什么用处?   问题来源   我们先看一个C++中被人诟病已久的问题: 我把某文件的内容读取到vector中,用函数如何封装? 大部分人的做法是: v ...

  2. C++ 新特性-右值引用

    作为最重要的一项语言特性,右值引用(rvalue references)被引入到 C++0x中.我们可以通过操作符“&&”来声明一个右值引用,原先在C++中使用“&”操作符声明 ...

  3. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  4. C++11 标准新特性: 右值引用与转移语义

    文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...

  5. [转载]如何在C++03中模拟C++11的右值引用std::move特性

    本文摘自: http://adamcavendish.is-programmer.com/posts/38190.htm 引言 众所周知,C++11 的新特性中有一个非常重要的特性,那就是 rvalu ...

  6. C++11 的右值引用

    作者:Tinro链接:https://www.zhihu.com/question/22111546/answer/30801982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  7. 【C/C++开发】C++11:右值引用和转发型引用

    右值引用 为了解决移动语义及完美转发问题,C++11标准引入了右值引用(rvalue reference)这一重要的新概念.右值引用采用T&&这一语法形式,比传统的引用T&(如 ...

  8. C++ 11的右值引用

    目录 一.问题导入 二.右值和右值引用 2.1 左值(lvalue)和右值(rvalue) 2.2 左值引用和右值引用 总结 参考资料 C++11 引入了 std::move 语义.右值引用.移动构造 ...

  9. c++11的右值引用、移动语义

    对于c++11来说移动语义是一个重要的概念,一直以来我对这个概念都似懂非懂.最近翻翻资料感觉突然开窍,因此记下.其实搞懂之后就会发现这个概念很简单,并无什么高深的地方. 先说说右值引用.右值一般指的是 ...

随机推荐

  1. openpose c++ 配置教程 + python api

    之前有介绍过基于tensorflow的openpose版本安装,但是我觉得没有caffe框架那么好用,很多功能也实现不了,比如调节net_resolution的调节,通过调节分辨率来提高检测的精确性和 ...

  2. BAPI_GOODSMVT_CREATE的参数GOODSMVT_CODE的说明

    BAPI_GOODSMVT_CREATE 的功能就是用于货物移动,其主要可以实现MB*事物的一些功能,其中该BAPI的参数 GOODSMVT_CODE就控制了对应哪个事物码的功能,下面给出该参数的值和 ...

  3. 阿里云OSS对象存储服务(一)

    一.开通"对象存储OSS"服务 申请阿里云账号 实名认证 开通"对象存储OSS"服务 进入管理控制台 二.控制台使用 1.创建Bucket 命名:guli-fi ...

  4. 参数模型检验过滤器 .NetCore版

    最近学习 .NETCore3.1,发现过滤器的命名空间有变化. 除此以外一些方法的名称和使用方式也有变动,正好重写一下. 过滤器的命名空间的变化 原先:System.Web.Http.Filters; ...

  5. 基于go-cqhttp实现QQ机器人

    本篇文章记录一下自己在编写QQ机器人的时候所遇到的一些问题和核心功能的实现. QQ机器人RabbitBot采用python编写,由于是个人学习使用,故目前不会开源完整代码,只会放出核心代码供学习参考. ...

  6. You shouldn't use *any* general-purpose hash function for user passwords, not BLAKE2, and not MD5, SHA-1, SHA-256, or SHA-3

    hashlib - Secure hashes and message digests - Python 3.8.3 documentation https://docs.python.org/3.8 ...

  7. TCP/IP中的Payload概念以及由此引申出的一些问题

    TCP报文一次性最大运输的货物量(Payload),大体可以这么来计算: IP报文头长度  +  TCP报文头长度  +  Payload长度  ≤ MTU 即左边的三者之和,要小于等于右边MTU的长 ...

  8. asctime_s asctime

    asctime_s  asctime // rand随机数.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h ...

  9. poj2631

    求一棵树的直径,所谓直径就是树上距离最远的两个点! 树形动归,每个点的为根的子树的最长向下链和次长链的和! 当然也可以二次深搜! ----------------------------------- ...

  10. Codeforces 1368F - Lamps on a Circle (交互博弈)

    这题也太新颖了吧.. 交互博弈 以前一直以为交互只能出二分 题意:长度为n的环形灯 玩家有两种操作 结束游戏 或者选择k个灯点亮 每次这个k是玩家自己选的 玩家操作后让电脑操作 电脑选择一个最优的点x ...