博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++11线程指南(3)--右值与左值
阅读量:4071 次
发布时间:2019-05-25

本文共 1150 字,大约阅读时间需要 3 分钟。

目录


1.左值与右值定义

    Lvalue与Rvalue可以粗略定义如下:

    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。

转载地址:http://kmeji.baihongyu.com/

你可能感兴趣的文章
redis sharding方案
查看>>
程序员最核心的竞争力是什么?
查看>>
Node.js机制及原理理解初步
查看>>
linux CPU个数查看
查看>>
分布式应用开发相关的面试题收集
查看>>
简单理解Socket及TCP/IP、Http、Socket的区别
查看>>
利用HTTP Cache来优化网站
查看>>
利用负载均衡优化和加速HTTP应用
查看>>
消息队列设计精要
查看>>
分布式缓存负载均衡负载均衡的缓存处理:虚拟节点对一致性hash的改进
查看>>
分布式存储系统设计(1)—— 系统架构
查看>>
MySQL数据库的高可用方案总结
查看>>
常用排序算法总结(一) 比较算法总结
查看>>
SSH原理与运用
查看>>
SIGN UP BEC2
查看>>
S3C2440中对LED驱动电路的理解
查看>>
《天亮了》韩红
查看>>
Windows CE下USB摄像头驱动开发(以OV511为例,附带全部源代码以及讲解) [转]
查看>>
出现( linker command failed with exit code 1)错误总结
查看>>
iOS开发中一些常见的并行处理
查看>>