C++ lvalue rvalue
文章目录
- 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相关推荐
- c++的lvalue和rvalue以及引用
目录 (0)lvalue和rvalue (1)左值引用 (2)右值引用 (3)move() (0)lvalue和rvalue 下面是我对这两个单词字面的意思的猜测: lvalue估计来源于left v ...
- 理解lvalue和rvalue
理解lvalue和rvalue Lvalues and Rvalues An object is a region of storage that can be examined and stored ...
- std:forward 完美转发
概述: // TEMPLATE CLASS identity template<class _Ty> struct identity { // map _Ty ...
- 树的更多相关算法-3
此代码包含了构建哈夫曼树的代码,在后面几段 //计算一个二叉树的节点个数,可以把所有的节点入队列,然后观察其rear的值,就知道其节点的个数, 这是一种广度的遍历方法 //下面的是一中深度的遍历的方 ...
- 中缀表达式生成二叉树
中缀表达式生成二叉树,大概应该有递规,迭代,和编译原理中的自顶向下的预测分析法等. 递规,迭代的思路每次读出一个数字,一个运算符,比较当前运算符和之前符号的优先级,进行相关的操作. 自顶向下的预测分析 ...
- C++11:forward及完美转发
简介 一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值了,并不是原来的类型. 比如: template <typename T> void forwardVa ...
- 四则运算3(二柱子同学的第三炼狱)
设计思路: 1.定义类node,变量有node类型root ,left,right以及string类型weight 2.初始化函数(以一个新节点为当前节点,根节点为null),设置一个计数器flag= ...
- 程序员编程艺术:第二章、字符串是否包含问题
程序员编程艺术:第二章.字符串是否包含及相关问题扩展 作者:July,yansha. 时间:二零一一年四月二十三日. 致谢:老梦,nossiac,Hession,Oliver,luuillu,雨翔,啊 ...
- 算法-连续项的最大和问题(最大子数组问题)三种不同解法
连续项的最大和问题 (1)暴力求解 时间复杂度 O(n^2) (2)分治求解 时间复杂度 O(nlogn) (3) 线性求解 时间复杂度 O(n) C#代码 using System; using S ...
最新文章
- JQuery 的部分高级语法
- 精密单电源虚拟地芯片 TLE2426
- android6.0重力工具箱,重力工具箱 GravityBox For Android8.0/8.1(Oreo)稳定版发布!
- Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate
- 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(2)--(P3P)
- 字节跳动入局全网搜索;思科回应中国区裁员;IntelliJ IDEA 新版发布! | 极客头条...
- 如何在github用git Pages上传自己在本地做的项目?
- python清理浏览器文件_URL可以在浏览器或wget中正常工作,但是从Python或cURL中清空...
- 量子计算机需要的基础,量子计算入门
- geoserver服务发布矢量地图流程
- OFDM链路自适应算法 注水算法简单c++实现
- TCP四次挥手中的2MSL是什么?
- Activiti学习之根据条件判断流程走向
- 高级驾驶辅助系统各子系统一览
- 项目的战前、战中与战后
- Linux命令之压缩zip
- Linux简介及常用命令
- java微信开发者模式开发_微信开发之启用开发者模式(三)
- 《BIGEMAP地图软件》荣登2017、2018年度论坛《最受欢迎谷歌地图软件》
- ArcGIS Runtime SDK for Windows Phone 入门教程