目录

  • C++03的左值和右值
  • C++11的左值和右值
  • 将亡值

在C++03中就有相关的概念

C++03的左值和右值

通俗的理解:

(1) 能放在等号左边的是lvalue
(2) 只能放在等号右边的是rvalue
(3) lvalue可以作为rvalue使用

对于第三点可以举个例子:
int x ;
x = 6; //x是左值,6是右值
int y ;
y = 6; //y是左值,6是右值
y = x; //x作为右值,所以左值是可以作为右值使用的

C++11对左值和右值做出了更加详细的划分。

C++11的左值和右值

表达值分为泛左值、右值;
泛左值分为左值和将亡值(涉及右值引用)
右值可分为纯右值和将亡值(涉及右值引用)

左值指定了一个函数或者对象(表达式计算得出的结果),它是一个可以取地址的表达式。
也就是说,如果一个函数或者对象可以取地址,那么他就是一个左值。

int lv1{ 42 }; // Object
int main() {int& lv2{ lv1 }; // Lvalue reference to Objectint* lv3{ &lv1 }; // Pointer to Object
}
int& lv4() { return lv1; } // Function returning Lvalue Reference

左值例子:

(1) 解引用表达式p
(2) 字符串字面量"abc"
(3) 前置自增/自减表达式 ++i / --i
(4) 赋值或复合运算符表达式(x=y或m
=n等)

纯右值是不和对象相关联的值(字面量)或者其求值结果是字面量或者一个匿名的临时对象.
纯右值例子:

(1) 除字符串字面量以外的字面量,比如 32, ‘a’

(2) 返回非引用类型的函数调用 int f() { return 1;}

(3) 后置自增/自减表达式i++/i–

(4) 算术/逻辑/关系表达式(a+b、a&b、a<<b)(a&&b、a||b、~a)(a==b、a>=b、a<b)

(5) 取地址(&x)

如:

72.0f
a–
x为一个整型变量,&x

左值可以当成右值使用

将亡值

将亡值也指定了一个对象,是一个将纯右值转换为右值引用的表达式:
&&这里不是逻辑与运算符,而是右值引用

int&& rvr1{ 22 }; // 右值引用可以引用纯右值

我们先来看什么是左值引用:
a是个左值,b是a的引用,为左值引用。

int a = 1;
int& b = a;

如果a是个常量22,我们对其引用就会出错:
如下:

int& b{22};      //错!非常量左值引用不可引用纯右值

为了解决这个问题,可以使用const 引用(常量左值引用)引用纯右值:
这样就能保证22(纯右值)不会通过b修改,这样b就相当于是22的别名。

const int& b{22};

当然还有另一种引用纯右值的方法就是右值引用了:
通过右值引用可以使纯右值的生存期增加,例如:
int&& rvr1{ 22 }; // 右值引用可以引用纯右值
int rv2 =++rv1;
原本22在执行完第一个语句就会消亡,但是使用右值引用之后,就可以在后面的语句通过调用右值引用,继续使用这个值了。

总例:

int prv(int x) { return 6 * x; } // pure rvalue int main() {const int& lvr5{ 21 }; // 常量左值引用可引用纯右值int& lvr6{ 22 }; // 错!非常量左值引用不可引用纯右值int&& rvr1{ 22 }; // 右值引用可以引用纯右值int& lvr7{ prv(2) }; // 错!非常量左值引用不可引用纯右值int&& rvr2{ prv(2) }; // 右值引用普通函数返回值rvr1 = ++rvr2; // 右值引用做左值使用}

【C++grammar】左值、右值和将亡值相关推荐

  1. c语言 变量的左值和右值,C++雾中风景10:聊聊左值,纯右值与将亡值

    C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...

  2. c++ 左值 广义左值 右值 纯右值 将亡值

    为什么C/C++等少数编程语言要区分左右值? 历史原因: C语言作为一门古老的编程语言,其设计初衷是为了在硬件资源有限的系统上进行高效的编程,因此其语法和语义设计相对较简单.左值和右值的概念最初是由C ...

  3. 左值右值将亡值泛左值

    左右值概念 简单理解 左值:赋值运算符左边的变量,可以接受右边值,例如 int a = 10; a就是一个左值右值:赋值运算符右边的值,这个值可以是一个变量也可以是一个常量,例如 int a = 10 ...

  4. 左值、右值、将亡值 | 左值引用、右值引用

    左值.右值.将亡值 左值.右值 左值(lvalue)中l指的是location,是有明确地址的,可寻址的值.右值(rvalue)中r指的是read,是可读的值,不一定可以寻址.左值可以当右值使用,但右 ...

  5. Cpp / 右值、纯右值、将亡值

    一.左值与右值 左值(lvalue)和右值(rvalue)是 C++ 类型系统之中的基础概念,我们不需要了解这些基础概念,同样也能写出代码.但是如果没有弄清左右值的概念,对于许多 C++ 高级特性的探 ...

  6. C++基础知识(二)--左值右值--逻辑表达式求值优化--逗号运算符与表示式--输入输出格式控制...

    :一.C++左值右值概念 左值:c++将变量名代表的单元称为左值,而将变量的值称为右值,左值必须是内存中可以访问且可以合法修改的对象,因此只能是变量名,而不能是常量或表达式.即左值可以寻址. 右值:将 ...

  7. C、C++差异之左值右值

    C与C++在语法细节上还是有一些差异的,虽然一般情况下可能这些差异不足以造成结果的区别,但有些代码确实会有影响. 这次,主要总结下左值右值的差异. 在C中,很多左值运算符的结果都不再是左值,然而在C+ ...

  8. C++11新特性之左值右值及移动语句与完美转发

    C左值右值 左值和右值的由来 什么是左值和右值 左值右值的本质 引用 左值引用 右值引用 移动语句与完美转发 移动语句 实现移动构造函数和转移赋值函数 stdmove 完美转发Perfect Forw ...

  9. C++11 左值 右值

    在C++11中所有的值必属于左值.右值两者之一. C++98 左值(lvalue),可以放在赋值运算符=左边的变量或者表达式,有名字,可以取地址. 右值(rvalue),临时变量值(非引用返回的函数返 ...

最新文章

  1. Node.js 安装及环境配置之 Windows 篇
  2. zend studio调试
  3. spring boot实战(第七篇)内嵌容器tomcat配置
  4. 七夕节福利,一套java架构师资源等你拿
  5. SpringBoot+MyBatisPlus整合时提示:Invalid bound statement(not found):**.dao.UserDao.queryById
  6. 使C#代码现代化——第三部分:值
  7. android 7.0原生动态,Android7.0适配教程,心得
  8. Eclipse启动Tomcat时,45秒超时解决方案
  9. 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
  10. Win11如何给系统盘瘦身?Win11系统盘瘦身方法
  11. 零基础CSS入门教程(29)–CSS下拉菜单实例
  12. Windows server 2016中文语言包安装教程
  13. Delphi中ComPort通信中的数据处理
  14. 分享100个精美的作品集网站设计案例
  15. 图片云存储服务商在阿里云和又拍云之间如何选择?
  16. dcos 1.7 目录挂载测试
  17. [18调剂]天津大学软件学院软件工程(专业学位)全日制及非全日制研究生接收院内校内校外调剂...
  18. 乘2取整法_十进制小数转换成二进制小数,可以采用“乘2取整”法
  19. #今日论文推荐# 陈天奇、王威廉等人推荐:ACL最佳论文奖得主给新入行研究者的一点建议
  20. [Practical.Vim(2012.9)].Drew.Neil.Tip03 学习摘要

热门文章

  1. python读取word图片_Python中如何读取Word中的图片
  2. js,jq.事件代理(事件委托)复习。
  3. iview-admin框架运行步骤
  4. vue2.0中的:is和is的区别
  5. 【简记】HTML CSS 的一些要点(不定时更新)
  6. (转)模拟鼠标/键盘
  7. Cisco TrustSec(理解)
  8. 【看番杂感】Clannad系列观后感(剧透慎入)
  9. Spring入门第二十五课
  10. 3.0 C++远征:is a