理解lvalue和rvalue

原创 2011年05月11日 09:24:00

今天看C++模板的资料,里面说到lvalue,rvalue的问题,这个问题以前也看到过,也查过相关资料,但是没有考虑得很深,只知道rvalue不能取地址,不能赋值等等一些规则。今天则突然有了更深层次的理解(也可以说是顿悟,耗时不过几秒钟),记录下来。

下面是我对这两个单词字面的意思的猜测:

  • lvalue估计来源于left value。 在赋值语句中lvalue = rvalue;位置处于左边。就是可以修改的值。
  • rvalue估计来源于right value。处于赋值语句右边,是只读的不可修改的值。

接下来是我所悟到内容的详细分析

  • lvalue是可以赋值的,说明它是一个变量,它在内存中一定存在,一定有地址。所以&lvalue是有效的,能取到在内存中的地址。

    访问lvalue一定会导致CPU访问存储器(相对较慢的操作)。

    lvalue的例子:

  • rvalue是不可以赋值的,它不是一个变量,在内存中没有存在,没有地址。它要么是存在于CPU的寄存器中,要么是存在于指令中(立即数)。所以只要对rvalue取地址,那么就一定是错误的(编译器会抱怨的)。

    访问rvalue不会导致CPU访问存储器(对立即数和寄存器的访问很快)。

    rvalue的例子:

  • 函数的返回值是rvalue,对于返回int, char 等这样最基本的类型,是通过CPU寄存器返回的,因此返回值没有地址是可以理解的。但是如果函数返回的是一个用户自定义类型的对象,肯定不可能通过寄存器来返回这个对象值的(寄存器大小数量都有限,对象的大小可以非常大),那究竟是怎样返回对象的呢?

    带着疑问,我查了查vc编译出来的代码,原来obj这个局部变量的地址被压入了堆栈,foo函数内部以堆栈上的obj地址作为this指针调用了UDT的构造函数。噢,难怪执行UDT obj = foo();这个语句只有调用了一次构造函数,而没有调用operator =,这都是因为函数返回值必须是rvalue这个规则所带来的好处,如果返回值是一个lvalue,那么这个语句一定会调用operator = 运算符。

C++ - 左值(lvalue)引用和右值(rvalue)引用 的 区别

左值(lvalue)引用和右值(rvalue)引用 的 区别   左值引用, 即&i, 是一种对象类型的引用; 右值引用, 即&&i, 是一种对象值的引用; std::move()可以把左值引用, 转...
  • u012515223
  • u012515223
  • 2013年11月10日 16:57
  • 4284

C++中rvalue和lvalue详悉

以下内容是参考书籍以及晚上的内容,整理而成,仅供参考~~ lvalue和rvalue 在计算机的远古时代,变量的lvalue和rvalue是指: lvalue:变量在内存中的位置。通过它能够...
  • piaoxuezhong
  • piaoxuezhong
  • 2017年03月06日 15:11
  • 570

LValue RValue

LValue RValue https://msdn.microsoft.com/zh-cn/library/f90831hc.aspx An lvalue refers to a...
  • zhaozhencn
  • zhaozhencn
  • 2016年03月31日 15:14
  • 175

lvalue & rvalue

看到人讨论隐式类型转换。大致摘一点,记录一下。#include #include class dummy{};class A{public: A(){} A(const dummy& d){} voi...
  • infinitude_CN
  • infinitude_CN
  • 2006年04月04日 14:15
  • 1702

C/C++ 之 left operand must be l-value 错误提示总结

编译器:vc6.0 语言:c/c++ = : left operand must be l-value 到底是什么错误? 解释:赋值号(‘=’)左边的操作数必须是一个左值。通俗的说:左值就是可以改...
  • u013630349
  • u013630349
  • 2016年02月29日 10:34
  • 13238

[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

场景: 1. C++11 引入了std::move,它可以高效率的从一个左值资源移动到另一个左值资源里, 这个过程不需要再创建新的资源. 这对std::string,std::vector这种标...
  • infoworld
  • infoworld
  • 2016年02月18日 14:45
  • 2126

C和C++里面的lvalue 和 rvalue的释义

在看GCC的文档的时候,看到一个词lvalue,查了金山词霸其释义为 lvalue [计] 左值。因为的确在介绍编译原理的课程中听过这个词,大致知道其意思就没有多想。但是看完GCC文档的这个篇幅,都无...
  • Borenbao
  • Borenbao
  • 2006年08月25日 14:13
  • 1398

lvalue和rvalue、传值和传引用、木桶

摘自:http://www.cnblogs.com/linyawen/archive/2011/12/07/2279936.html http://gideshi.blog.163.com/bl...
  • liming0931
  • liming0931
  • 2012年07月27日 17:35
  • 551

开源库ZXing加入xcode工程

从网上下载的是zxing-2.2版本。然后按照http://www.cocoachina.com/applenews/devnews/2013/0104/5462.html的例子操作,这个是对的,只是...
  • nogodoss
  • nogodoss
  • 2013年07月19日 14:32
  • 4225

关于左值与右值(lvalue & rvalue)

Lvalues and Rvalues Dan Saks JUNE 1, 2001 inShare1 C and C...
  • lxgwm2008
  • lxgwm2008
  • 2013年02月21日 11:20
  • 925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解lvalue和rvalue
举报原因:
原因补充:

(最多只允许输入30个字)