C++ 中的左值和右值

简介

《C++ Primer》中左值和右值的描述如下:

C++ 的表达式要不然是右值(rvalue,读作"are-value"),要不然就是左值(lvalue,读作"ell-value").这两个名词是从C语言继承过来的,原来是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能.
在 C++ 语言中,两者的区别就没那么简单了.一个左值表达式的求值结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象.此外,虽然某些表达式的求值结果是对象,但是它们是右值而非左值.可以做一个简单的归纳:当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置).

通俗解释

int x = 666;

上述为一个常见的赋值初始化操.在其中x是一个变量,是一个左值,使用的是它的内存地址.而666是一个字面常量,没有指定的内存地址,使用的是它的值.
所以常见的错误解释如下:

/** 1 **/
int y;
666 = y;   // error! 666 是右值,并没一个内存地址/** 2 **/
int* p = &666; // error! 666 是右值,并没一个内存地址/** 3 **/
int get_six(){return 6;
}
get_six() = 3; // error! 返回值是右值,并没有一个内存地址/** 4 **/
int& get_value(){static value = 1;return value;
}get_value() = 666;    // OK 返回值是一个引用,为左值/** 5 **/
int& yref = 10;        // error! 右值向左值的隐式转换void fnc(int& x){}fnc(10);           // error! 右值向左值的隐式转换/** 6 **/
const int& ref = 10;  // OK!void fnc2(const int& x){}
fnc2(10);  // OK!
// const 指定为常量后, C++ 的编译器会创建一个隐藏变量(即左值),初始化储存的字面常量,然后将隐藏的变量绑定在引用上.

参考资料

理解C++中的左值和右值
C++右值引用和移动

C++ 中的左值和右值相关推荐

  1. c++中的左值与右值

    转载自 http://www.cnblogs.com/catch/p/3500678.html 左值 (lvalue)和右值 (rvalue) 是 c/c++ 中一个比较晦涩基础的概念,有的人可能甚至 ...

  2. c 表达式必须是可修改的左值_C++中的左值,右值,左值引用,右值引用

    童帅 2020-2-22 文中的"表达式"都是指赋值表达式 左值,右值,左值引用,右值引用 到底是什么 左值和右值 int a = 10; int b = 5; int c = a ...

  3. java中的左值右值_快速了解C/C++的左值和右值

    最近在segmentfault上看到一个提问<c++隐式的类类型转换问题>:一时不知怎么回答,查阅相关资料后整理了本文,以供参考学习. 定义 早期的C给出的定义:左值是一个表达式,可能出现 ...

  4. [c++]-c++中的左值和右值、左值引用和右值引用、万能引用和引用折叠及完美转发

    1.左值和右值 1.1左值和右值定义 在c++中,左值是一个指向内存的东西,换句话来讲,左值有地址,保存在内存中,右值则为不指向任何地方东西,即不在内存中占有确定位置.一般来说,右值是暂时和短暂的,而 ...

  5. 详解C++中地左值、右值和移动

    左值持久,右值短暂 C++ primer中提到过:当一个对象被用作右值时用的是对象的值(内容),当对象被用做左值时用的是对象的身份(在内存中的位置) [ p r i m e r ] ^{[primer ...

  6. 简单聊聊C/C++中的左值和右值

    文章目录 前言 问题 历史渊源 认识左值和右值 具体的示例 最简单的赋值语句 自增自减运算 前置自增 后置自增 自增表达式赋值 函数表达式 总结 前言 为什么标题要写成简单聊聊,而不是写成什么&quo ...

  7. C++中 左值 与 右值 的区别

    C++中左值与右值的区别 C++的表达式要不然是 右值,要不然是 左值.这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能. 我们在 C/C++ 编程中并不会经 ...

  8. 理解C和C++中的左值和右值

    翻译至https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/ C/C++编程中不是 ...

  9. 理解C++中的左值和右值

    一.前言 一直以来,我都对C++中左值(lvalue)和右值(lvalue)的概念模糊不清.我认为是时候好好理解他们了,因为这些概念随着C++语言的进化变得越来越重要. 二.左值和右值--一个友好的定 ...

  10. C++中的左值和右值

    左右值的概念 C++中左值(lvalue)和右值(rvalue)在C++11后变得尤为重要,是理解 move.forward等新语义的基础. 左值和右值这两个概念是从C中传承过来的. 左值指的是:既能 ...

最新文章

  1. python有序队列_Python 队列
  2. Ubuntu安装deb软件包错误(依赖关系问题)解决
  3. UVA 315 :Network (无向图求割顶)
  4. php云服务器买什么系统吗,php云服务器买什么系统
  5. 进程间同步(互斥量、信号量)
  6. 初学python的小技巧_Python学习小技巧总结
  7. 一部影响美国网络安全政策的电影
  8. 为什么要用 SpringMVC 的 SessionStatus
  9. syntax error : missing ';' before identifier 'oper'解决方法
  10. Layui 是否开启合计行区域
  11. 华硕win10键盘失灵_华硕笔记本键盘失灵,小编告诉你华硕笔记本键盘失灵怎么解决...
  12. 基于SSH开发的校园一卡通管理系统
  13. B端产品-定义、分类、竞品分析、与C端产品的区别
  14. Notepad ++中的一个著名插件FingerText
  15. 超详细的bat脚本常用命令及亲测示例
  16. 7-2 sdust-Java-学生成绩读取与排序 (20 分)
  17. 画仓鼠大赛 评比开始!
  18. 基于Sentinel-1的干涉相干性特征生成
  19. TeamViewer 四个版本的功能区别(远程连接黑屏问题解答)
  20. Suzy找到实习了吗Day 3 | 链表开始啦 203移除链表元素 707设计链表 206 反转链表

热门文章

  1. 完美解决:找不到msvcr120.dll,需要重新安装服务
  2. jsdelivr 使用_如何使用JSDelivr
  3. java swt 状态栏_java – 在Mac上美化SWT应用程序
  4. 华为mate30lite鸿蒙测试销售,谷歌宣布Mate30禁用GMS服务,华为手机完成鸿蒙系统测试,价格感人...
  5. visual studio安装lua插件
  6. 新南威尔士大学预科部(UFS)入学成绩要求
  7. ti8淘汰赛_了解淘汰赛
  8. 白芸豆咀嚼片可以减肥吗?
  9. 花若盛開,蝴蝶自來。人若精彩,天自安排。
  10. 618首日战报:德施曼预售全网第一!全自动智能锁Q5P全网单品冠军