【C++grammar】左值、右值和将亡值
目录
- 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】左值、右值和将亡值相关推荐
- c语言 变量的左值和右值,C++雾中风景10:聊聊左值,纯右值与将亡值
C++11的版本在类型系统上下了很大的功夫,添加了诸如auto,decltype,move等新的关键词来简化代码的编写与降低阅读代码的难度.为了更好的理解这些新的语义,笔者确定通过几篇文章来简单窥探一 ...
- c++ 左值 广义左值 右值 纯右值 将亡值
为什么C/C++等少数编程语言要区分左右值? 历史原因: C语言作为一门古老的编程语言,其设计初衷是为了在硬件资源有限的系统上进行高效的编程,因此其语法和语义设计相对较简单.左值和右值的概念最初是由C ...
- 左值右值将亡值泛左值
左右值概念 简单理解 左值:赋值运算符左边的变量,可以接受右边值,例如 int a = 10; a就是一个左值右值:赋值运算符右边的值,这个值可以是一个变量也可以是一个常量,例如 int a = 10 ...
- 左值、右值、将亡值 | 左值引用、右值引用
左值.右值.将亡值 左值.右值 左值(lvalue)中l指的是location,是有明确地址的,可寻址的值.右值(rvalue)中r指的是read,是可读的值,不一定可以寻址.左值可以当右值使用,但右 ...
- Cpp / 右值、纯右值、将亡值
一.左值与右值 左值(lvalue)和右值(rvalue)是 C++ 类型系统之中的基础概念,我们不需要了解这些基础概念,同样也能写出代码.但是如果没有弄清左右值的概念,对于许多 C++ 高级特性的探 ...
- C++基础知识(二)--左值右值--逻辑表达式求值优化--逗号运算符与表示式--输入输出格式控制...
:一.C++左值右值概念 左值:c++将变量名代表的单元称为左值,而将变量的值称为右值,左值必须是内存中可以访问且可以合法修改的对象,因此只能是变量名,而不能是常量或表达式.即左值可以寻址. 右值:将 ...
- C、C++差异之左值右值
C与C++在语法细节上还是有一些差异的,虽然一般情况下可能这些差异不足以造成结果的区别,但有些代码确实会有影响. 这次,主要总结下左值右值的差异. 在C中,很多左值运算符的结果都不再是左值,然而在C+ ...
- C++11新特性之左值右值及移动语句与完美转发
C左值右值 左值和右值的由来 什么是左值和右值 左值右值的本质 引用 左值引用 右值引用 移动语句与完美转发 移动语句 实现移动构造函数和转移赋值函数 stdmove 完美转发Perfect Forw ...
- C++11 左值 右值
在C++11中所有的值必属于左值.右值两者之一. C++98 左值(lvalue),可以放在赋值运算符=左边的变量或者表达式,有名字,可以取地址. 右值(rvalue),临时变量值(非引用返回的函数返 ...
最新文章
- Node.js 安装及环境配置之 Windows 篇
- zend studio调试
- spring boot实战(第七篇)内嵌容器tomcat配置
- 七夕节福利,一套java架构师资源等你拿
- SpringBoot+MyBatisPlus整合时提示:Invalid bound statement(not found):**.dao.UserDao.queryById
- 使C#代码现代化——第三部分:值
- android 7.0原生动态,Android7.0适配教程,心得
- Eclipse启动Tomcat时,45秒超时解决方案
- 做一个消息自动回复,但是回复内容可以在网页上面输入,用input接收,错了,别人有新增选项,本身就是在页面进行新增,页面维护...
- Win11如何给系统盘瘦身?Win11系统盘瘦身方法
- 零基础CSS入门教程(29)–CSS下拉菜单实例
- Windows server 2016中文语言包安装教程
- Delphi中ComPort通信中的数据处理
- 分享100个精美的作品集网站设计案例
- 图片云存储服务商在阿里云和又拍云之间如何选择?
- dcos 1.7 目录挂载测试
- [18调剂]天津大学软件学院软件工程(专业学位)全日制及非全日制研究生接收院内校内校外调剂...
- 乘2取整法_十进制小数转换成二进制小数,可以采用“乘2取整”法
- #今日论文推荐# 陈天奇、王威廉等人推荐:ACL最佳论文奖得主给新入行研究者的一点建议
- [Practical.Vim(2012.9)].Drew.Neil.Tip03 学习摘要