我个人认为的区分左值和右值的原因:

赋值的意义(基本上)是把右边的值放进左边的位置,替换掉左边位置原有的值。从而赋值对左边期望的是位置与其中的值的结合(相当于 C/C++ 的对象),对右边期望的是单纯的值。在这种语义差别下就有了左右值的区别。

以下是一些补充内容。首先我说下 C++17 起的情况。

prvalue (纯右值)不是对象,它是潜在生成对象的,没有对应位置的“纯”值。只有在要求有对象的语境中,它才会实质化变成对象。对于非类、非数组类型的对象类型纯右值,有些语境会使它不需要变成对象(譬如 1 + 2; 这条语句中, 1 、 2 和整个表达式都是纯右值,都不会变成对象)。

C++17 起一个类类型纯右值用以初始化同类型变量或返回值时,它没有(也不可能)被移动,而是直接实质化变成了该变量,或者通过 return 维持纯右值的性质传递。没有临时对象。除非在函数调用中类型满足一定条件。这是为了允许通过寄存器传递返回。

有些时候纯右值会需要变成临时对象,比如绑定到引用、类或数组类型的纯右值表达式出现在弃值表达式中、要求对纯右值访问子对象等等。 C++17 起认为实质化的结果是一个 xvalue (亡值),而引用不会绑定到纯右值。

然后是 C++11/14 的划分。这种划分在我看来不如 C++17 的纯粹。

C++11/14 中纯右值一并指代实质化后产生的完整临时对象(不实质化的情况才没有对象),而引用会绑定到纯右值。具体行为上和 C++17 区别是类类型的纯右值会在该表达式出现的场所直接实质化变成临时对象,这导致更多地方需要可调用的构造函数。另外 C++11/14 标准术语上没有纯右值变亡值的转换这一步。

最后再来看 C++98/03 。 C++98 标准术语不区分亡值和纯右值,统称右值。不过这不妨碍我们用 C++11 的划分来讨论。

C++98/03 没有右值引用类型,从而无法把左值标记成亡值(但由于 const 左值引用的性质,反过来可以)。这样一来 C++98 中亡值指代的都是完整临时对象的子对象,而纯右值与亡值统称右值也稍微纯粹一些:要么不指代对象,要么指代临时对象。(注意下标表达式的值类别存在问题 CWG1213 。多数编译器把数组右值取下标为亡值视作 C++11 的改动,而 C++98 中得到左值。但最新的 gcc 把这个缺陷报告应用到 C++98 ,从而在 C++98 模式也得到右值。)

另外 C++98 起就允许更改语义的复制消除,允许一些同类型对象“直接成为结果”而不调用构造函数。注意即使编译器进行复制消除,也要求相应的构造函数被定义且可调用。

C++11 起的移动构造是一种(可能)修改原有对象以创建新对象的操作。在发生移动构造时,必须已经存在了一个源对象,而且指代它的表达式是右值(可以是临时对象,也可以是手动标记成亡值的非临时对象)。注意通常来说允许外部修改对象的操作需要维持对象在合法状态,移动构造(或移动赋值)也只是其中一种而已。

上面这些内容主要说的是关于值类别与对象的讨论。这是因为我认为至少在 C++ 中区分左值和右值不如区分指代对象的表达式和“纯”值—— C++17 起的对象类型泛左值( glvalue )和纯右值。类似地 Rust 中两类表达式分别叫“位置表达式”和“值表达式”。

java左右值_为什么C/C++等少数编程语言要区分左右值?相关推荐

  1. el-option传两个值_俗话说买房看地段,买窗看K值:如何区分K值、U值和R值

    李嘉诚曾经说过,影响房子价值的三个关键"地段.地段,还是地段",可见一个房子地段的好坏,基本决定这个房子的定价. 对于房子来说,地段就是生活氛围,其中包括交通,商业,休闲娱乐,医疗 ...

  2. java逆波兰式求值_波兰式、逆波兰式与表达式求值

    波兰式.逆波兰式是<数据结构>课程中讲解关于栈的时候提到的,栈是很简单的一种数据结构.但是这些理论的提出却是计算机早期发展领域的重大突破,值得仔细回味. 1. 中缀表达式 我们在数学中学到 ...

  3. java 图片 哈希值_上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中...

    上传图片用图片文件的对象hash哈希值判断图片是否一样,避免重复提交相同的图片到服务器中 前端:要用到一个插件,点击下载 企业用户后台管理系统 - 谭人才招聘系统 function ajaxfile( ...

  4. ajaxfileupload 返回值_用ajaxFileUpLoad上传文件不能正确取得返回值的问题

    c++ eof()函数 C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大 ...

  5. formdata.append加多个值_呆哥数学每日一题 —— 多个最值函数混合向量

    如果想要获取往期每日一题电子版,可以加我微信:daigemath166,备注:知乎 每日一题 呆哥解析: 这是一道多个最值函数混合向量的问题 首先看到这种一大堆条件的题目,我们先不要觉得麻烦,先把可以 ...

  6. 用python计算pi的值_如何使用python中的series计算pi的值?

    欢迎来到StackOverFlow.在 因此,您的代码有一些问题: 首先,您应该在代码的开头使用import math语句(除非您刚刚排除了它).这允许您使用math.sqrt()和math.pow( ...

  7. list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值

    使用LINQ获取列表中的某个字段值,下面以获取员工列表中的编号字段为例子. 1.使用Select方法 1 List emplayeeList = GetEmplayeeList(); //获取员工信息 ...

  8. html下拉框设置默认值_如何设置HTML select下拉框的默认值?

    HTML中的select标签用于创建可选择选项的下拉列表:option标签包含选定时将使用的值.那么如何来设置select下拉框里的默认值?下面本篇文章就来给大家介绍一下,希望对大家有所帮助. 我们可 ...

  9. python修改xml属性值_根据其属性查找xml元素并更改其值

    您可以像这样访问属性值:from elementtree.ElementTree import XML, SubElement, Element, tostring text = "&quo ...

最新文章

  1. Router OS之禁止P2P下载
  2. COM和ATL学习方法
  3. linux通信中recv,linux套接字通信之recv中的缓存机制的研究
  4. 模拟器真机环境_Appium+python自动化(二)- 环境搭建—下(超详解)
  5. 德勤发布2021年度企业AI应用现状报告,AI驱动已成竞争必需品
  6. batchsize一定是2的幂_学习率和batchsize如何影响模型的性能?
  7. 2016OSC源创会年终盛典-前端技术专场-阴明
  8. 如何做web程序权限管理
  9. GitHub 开发者页面迁至 github.io
  10. [NOIp2017 DG Day 2 T1] 奶酪
  11. 如何将img镜像安装到硬盘、解决默认分区小的问题
  12. python版webpower的edm的api接口
  13. jsplacement1.3中文汉化版
  14. 昆腾公司稍感安慰:向外扩展存储业务营收有所提升
  15. m4s格式转换mp3_简单的amr转换mp3音频格式转换方法
  16. opencv里cols、rows分别对应宽(列)、高(行)
  17. POJ 3295.Tautology
  18. Cesi运行报错AttributeError: can‘t set attribute
  19. 高中数学几何题解题技巧:立体几何三视图高效还原方法—拔高法
  20. java读取word表格中的数据_JAVA获取word表格中数据的方案

热门文章

  1. GCD 深入理解(一)
  2. 1.4.2 真正的建造者模式(3.2)
  3. 百度缺的不是狼性,而是鲁滨逊
  4. windows 2003系列之搭建域环境
  5. 第十周Java学习总结
  6. Android 应用资源及R文件的位置
  7. 换工位解决ssh 卡住的背后
  8. 用java网络编程中的TCP方式上传文本文件及出现的小问题
  9. call()函数、apply()函数区别与意义
  10. POJ 2392 Space Elevator(多重背包变形)