文章目录

  • C++ lvalue VS rvalue
    • 定义
    • 一个复杂点的例子

C++ lvalue VS rvalue

参考这篇blog

定义

不严格的说,在C++中,左值是明确指向一块内存地址的,而右值不指向任何地方。(an lvalue is something that points to a specific memory location. On the other hand, a rvalue is something that doesn’t point anywhere.)一般右值的存在是很短暂的,而左值可以以变量的身份长时间存在。可以认为左值是一种容器,而右值是容器里的东西,要是没有容器就会消失。
比如下面这个例子:

int x = 666;

666是rvalue,只是一个字面常量(数字),没有实际的内存地址,只有程序运行起来时可能存短暂的存在于寄存器中。
而x是变量,对应着实际的内存地址,666这个rvalue是要赋值给lvalue x的

C++是要求赋值语句要求等号左边必须是lvalue,所以下面这个显然是不行的:

666 = x;

另外 & 符号可以接受一个lvalue,然后得到一个rvalue,例如下面这句是可行的, x本身是一个lvalue,但是&符号返回了这个变量所指向的内存地址,相当于是rvalue

int* y = &x;   // ok

但是下面这个就不行了:

int* y = &666; // error!

因为&期待的是一个lvalue,而666是个rvalue

一个复杂点的例子

#include <iostream>
using namespace std;
class A {public:A(const std::string& method = "unknown"){cout<<"in A "<<"\n";}void f() &  { cout << "Lvalue" << endl; }void f() && { cout << "Rvalue" << endl; }
};
void afunc(const A & a){cout<<"get a "<<"\n";cout<<typeid(a).name()<<"\n";A().f();cout<<endl;
}
void afunc2(A & a){cout<<"get in a2"<<"\n";cout<<typeid(a).name()<<"\n";A().f();a.f();cout<<endl;
}
int main()
{cout << "Hello World";A a;afunc2(a);afunc2(A());//  error: cannot bind non-const lvalue reference of type ‘A&’ to an rvalue of type ‘A’afunc(A()); return 0;
}

可以看到那行报错信息:

afunc2(A());
//  error: cannot bind non-const lvalue reference of type ‘A&’
//to an rvalue of type ‘A’

传入的A()是一个rvalue,而预先声明的A a;是一个变量,是一个lvalue,所以会出现问题

这里两个函数都是传递的A的引用,但加了const之后是不能修改的,参数里的a只是实际传入的对象的别称

C++ lvalue rvalue相关推荐

  1. c++的lvalue和rvalue以及引用

    目录 (0)lvalue和rvalue (1)左值引用 (2)右值引用 (3)move() (0)lvalue和rvalue 下面是我对这两个单词字面的意思的猜测: lvalue估计来源于left v ...

  2. 理解lvalue和rvalue

    理解lvalue和rvalue Lvalues and Rvalues An object is a region of storage that can be examined and stored ...

  3. std:forward 完美转发

    概述:     // TEMPLATE CLASS identity template<class _Ty>     struct identity     {    // map _Ty ...

  4. 树的更多相关算法-3

    此代码包含了构建哈夫曼树的代码,在后面几段 //计算一个二叉树的节点个数,可以把所有的节点入队列,然后观察其rear的值,就知道其节点的个数,  这是一种广度的遍历方法 //下面的是一中深度的遍历的方 ...

  5. 中缀表达式生成二叉树

    中缀表达式生成二叉树,大概应该有递规,迭代,和编译原理中的自顶向下的预测分析法等. 递规,迭代的思路每次读出一个数字,一个运算符,比较当前运算符和之前符号的优先级,进行相关的操作. 自顶向下的预测分析 ...

  6. C++11:forward及完美转发

    简介 一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值了,并不是原来的类型. 比如: template <typename T> void forwardVa ...

  7. 四则运算3(二柱子同学的第三炼狱)

    设计思路: 1.定义类node,变量有node类型root ,left,right以及string类型weight 2.初始化函数(以一个新节点为当前节点,根节点为null),设置一个计数器flag= ...

  8. 程序员编程艺术:第二章、字符串是否包含问题

    程序员编程艺术:第二章.字符串是否包含及相关问题扩展 作者:July,yansha. 时间:二零一一年四月二十三日. 致谢:老梦,nossiac,Hession,Oliver,luuillu,雨翔,啊 ...

  9. 算法-连续项的最大和问题(最大子数组问题)三种不同解法

    连续项的最大和问题 (1)暴力求解 时间复杂度 O(n^2) (2)分治求解 时间复杂度 O(nlogn) (3) 线性求解 时间复杂度 O(n) C#代码 using System; using S ...

最新文章

  1. JQuery 的部分高级语法
  2. 精密单电源虚拟地芯片 TLE2426
  3. android6.0重力工具箱,重力工具箱 GravityBox For Android8.0/8.1(Oreo)稳定版发布!
  4. Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate
  5. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(2)--(P3P)
  6. 字节跳动入局全网搜索;思科回应中国区裁员;IntelliJ IDEA 新版发布! | 极客头条...
  7. 如何在github用git Pages上传自己在本地做的项目?
  8. python清理浏览器文件_URL可以在浏览器或wget中正常工作,但是从Python或cURL中清空...
  9. 量子计算机需要的基础,量子计算入门
  10. geoserver服务发布矢量地图流程
  11. OFDM链路自适应算法 注水算法简单c++实现
  12. TCP四次挥手中的2MSL是什么?
  13. Activiti学习之根据条件判断流程走向
  14. 高级驾驶辅助系统各子系统一览
  15. 项目的战前、战中与战后
  16. Linux命令之压缩zip
  17. Linux简介及常用命令
  18. java微信开发者模式开发_微信开发之启用开发者模式(三)
  19. 《BIGEMAP地图软件》荣登2017、2018年度论坛《最受欢迎谷歌地图软件》
  20. ArcGIS Runtime SDK for Windows Phone 入门教程

热门文章

  1. 属于编程的黄金时代结束了吗?
  2. Spring Cloud Ribbon 中的 7 种负载均衡策略
  3. 【2】 CSE3 概述
  4. 开源库源代码构建的一般方式(CEGUI举例)
  5. JZ11 旋转数组的最小数字
  6. Hive2.0 在 Hadoop2.7部署 (2017.03添加异常处理)(图文解说)
  7. Medium Unlimited骚操作
  8. 导热硅脂与导热硅胶的区别解析
  9. 计算机一级考试培训费用广东,广东全国计算机等级考试(NCRE)报考条件以及费用...
  10. 做好文献综述整理、科研写作积累