C++11线程指南(3)--右值与左值
来源:互联网 发布:怎么改mac地址 编辑:程序博客网 时间:2024/06/10 17:24
1. Rvalue与Lvalue可以粗略定义如下:
lvalue: 存储在内存(堆或者栈)中的,可以寻址到的一个值。
rvalue: 不属于lvalue范畴的一个值。它存在于表达式的右侧。
2. 示例
大多数的值是一个左值。
对于这条规则,"左值引用仅能与左值绑定,不能绑定右值", 它也同样适用于函数的参数。
lvalue: 存储在内存(堆或者栈)中的,可以寻址到的一个值。
rvalue: 不属于lvalue范畴的一个值。它存在于表达式的右侧。
2. 示例
大多数的值是一个左值。
int k = 10; //k: lvalueint *pk = &k; //k is addressablek = 10; //can modifyclass dummy {};dummy dy; //dy is an lvalue for a user defined type那么什么是右值呢?
int k = 11; //k is lvalue but 11 is rvalueint j = k+3; //(k+3) is an rvalueint *pk = &(k+3); //wrong! it is not addressablek + 3 = 10; //wrong! cannot assign a value to it3 = k; //wrong! not assignableclass dummy {};dy = dummy(); //dummy() is an rvalue另外,函数返回值也是一个右值
int square(int i) { return i*i; }int sq = square(10); //square(10) is an rvalue
3. 左值引用与右值引用
基于上述结论,那么一个引用是左值还是右值呢?
事实上,我们一直使用的引用,是一个左值引用 - 引用lvalue! "左值引用仅能与左值绑定,不能绑定右值"!
int i;int &r = i;int &r = 8; //wrong! lvalue can not be bound to rvalue 8.但是,我们可以将一个const左值引用绑定到右值.
const int&r = 7; //OK这是合法的,因为当编译器看到const时,它会将7转换为lvalue, 再将其赋给一个引用。
对于这条规则,"左值引用仅能与左值绑定,不能绑定右值", 它也同样适用于函数的参数。
int square(int &x) { return x*x; }int i=9;square(i); //OKsquare(9); //wrong! 9 is an rvalue and can not be assigned to reference有没有方法将9传递给函数square?当然有的,可以使用const。
0 0
- C++11线程指南(3)--右值与左值
- C 左值与右值
- 【C语言】左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 左值与右值
- 数组和指针
- 关于Java中两个数组的复制(b=a)
- Cocos2d-x设计模式之三:管理者模式
- CM10.1到三星wave的移植
- 谷歌Android遭遇“颠覆”危机
- C++11线程指南(3)--右值与左值
- 杭电acm2089 hdu-acm-2089不要62解题报告
- 如何提高自己的阅读能力和理解能力?
- poj 1056 IMMEDIATE DECODABILITY 字典树
- 开源夏令营之foldcolumn工具及解决方案(五)数值精度处理实现
- Matrix multiplication(bitset)
- 设计模式06_原型模式
- Linux下的压缩解压缩命令详解
- 防沉迷与网络管制