首页 > 其他分享 >左值和右值的概览及其使用方法

左值和右值的概览及其使用方法

时间:2024-11-29 11:58:30浏览次数:7  
标签:AA 右值 int 左值 绑定 概览 引用

左值和右值的概念及其使用方法


前言

本文章详细讲解左值和右值的概念和使用方法,即展示了它的应用场景:移动语义和完美转发


一、什么是左值?什么是右值?

在C++中,所有的值不是左值,就是右值。左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束后就不再存在的临时对象。有名字的对象都是左值,右值没有名字。

还有一个可以区分左值和右值的便捷方法:看能不能对表达式取地址,如果能,则为左值,否则为右值。

C++11扩展了右值的概念,将右值分为了纯右值和将亡值。
纯右值:a)非引用返回的临时变量;b)运算表达式产生的结果;c)字面常量(C风格字符串除外,它是地址)。
将亡值:与右值引用相关的表达式,例如:将要被移动的对象、T&&函数返回的值、std::move()的返回值、转换成T&&的类型的转换函数的返回值。

不懂纯右值和将亡值的区别其实没关系,统一看作右值即可,不影响使用。
直接代码演示:

class AA
{
	int m_aa;
};
AA getaa()
{
	return AA();//返回一个匿名AA类的对象
}
int a = 3;//此时a是左值,3是右值
int b = a + 4;//b是左值,a+4是右值
AA aa=getaa();//aa是左值,getaa返回的AA的对象是临时变量,是右值

二、左值引用和右值引用

1.左值引用

左值引用就是给左值取一个名字
语法:数据类型 &变量名 = 左值;
代码演示,文字不好表述。

#include <iostream>
using namespace std;
int main()
{
	int a = 3;//a是左值,3是右值
	int &b=a;//等于号右边必须是左值
	//int &b=3;因为3是右值,所有这段代码错误
}

2.右值引用

C++98中的引用很常见,就是给变量取个别名,在C++11中,因为增加了右值引用(rvalue reference)的概念,所以C++98中的引用都称为了左值引用(lvalue reference)。

右值引用就是给右值取个名字。

语法:数据类型&& 变量名=右值;
代码演示:

#include <iostream>
using  namespace std;

class AA {
public:
    int m_a=9;
};

AA getTemp()
{
    return AA();
}

int main()
{
    int&& a = 3;         // 3是右值。

    int b = 8;               // b是左值。
    int&& c = b + 5;   //  b+5是右值。

    AA&& aa = getTemp();   // getTemp()的返回值是右值(临时变量)。

    cout << "a=" << a << endl;
    cout << "c=" << c << endl;
    cout << "aa.m_a=" << aa.m_a << endl;
}

getTemp()的返回值本来在表达式语句结束后其生命也就该终结了(因为是临时变量),而通过右值引用重获了新生,其生命周期将与右值引用类型变量aa的生命周期一样,只要aa还活着,该右值临时变量将会一直存活下去。

引入右值引用的主要目的是实现移动语义。

三、常量引用

左值引用只能绑定(关联、指向)左值,右值引用只能绑定右值,如果绑定的不对,编译就会失败。

但是,常量左值引用却是个奇葩,它可以算是一个万能的引用类型,它可以绑定非常量左值、常量左值、右值,而且在绑定右值的时候,常量左值引用还可以像右值引用一样将右值的生命期延长,缺点是,只能读不能改。大家可能无法理解,直接上代码演示:

语法:const 数据类型 &变量名=左值/右值;

int a = 1;        
const int& ra = a;   // a是非常量左值。

const int b = 1;  
const int& rb = b;  // b是常量左值。

const int& rc = 1;   // 1是右值。
//在数据类型前面加入const就可以绑定右值

这种在函数传递参数时用的比较频繁,直接演示:

#include <iostream>
using namespace std;
void fun(int& a)
{
	cout << "a=" << a << endl;
}
int main(int argc, char* argv[])
{
	//fun(2);这段代码错误,因为函数体内是左值引用,只能绑定左值
	//2是右值,所以编译器会报错
	return 0;
}

会出现以下错误:
在这里插入图片描述

如果传一个左值就不会报错

在这里插入图片描述
加入const后会解决这种问题

#include <iostream>
using namespace std;
void fun(const int& a)
{
	cout << "a=" << a << endl;
}
int main(int argc, char* argv[])
{
	fun(2);//这段代码不会报错,因为函数体内是常量左值引用,既可以绑定右值,也可以绑定左值
	return 0;
}

注意只能是常量左值引用,不能是常量右值应用


总结一下,其中T是一个具体类型:
1)左值引用, 使用 T&, 只能绑定左值。
2)右值引用, 使用 T&&, 只能绑定右值。
3)已命名的右值引用是左值。
4)常量左值,使用 const T&, 既可以绑定左值又可以绑定右值。

总结

本文章介绍了什么是左值,什么是右值和左值引用和右值引用。它在与函数传参和移动语义有很大的作用。移动语义后面再介绍。

标签:AA,右值,int,左值,绑定,概览,引用
From: https://blog.csdn.net/2301_76771136/article/details/144130728

相关文章

  • PE文件结构解析 Part1 概览
    文章来源:https://0xrick.github.io/win-internals/pe2/目录简介PE文件结构预览DosHeaderDOSStubNTHeadersSectionHeadersSections总结简介该篇文章的目标是,在不涉及细节的情况下,简单介绍一下PE文件格式。PE文件PE表示PortableExecutable(可移植执行文件),这是一种在Windo......
  • Android 图形系统之一:概览
    Android图形系统是一套完整的架构,用于管理从应用绘制到显示屏幕的整个流程。它涉及多个层次和组件,从应用程序到硬件,确保每一帧都能准确、高效地呈现到用户的设备屏幕上。1.Android图形系统的架构Android图形系统的架构可以分为以下几层:1.1应用层主要功能:负责生成绘......
  • Metasploit Pro 4.22.5-2024111401 发布下载,新增功能概览
    MetasploitPro4.22.5-2024111401发布下载,新增功能概览MetasploitPro4.22.5-2024111401(Linux,Windows)-专业渗透测试框架Rapid7Penetrationtesting,releasedNov14,2024请访问原文链接:https://sysin.org/blog/metasploit-pro-4/查看最新版。原创作品,转载......
  • CAD知识点概览 CAD数据交换与二次开发
    CAD知识点概览章节目录一、CAD基础概念与应用领域二、CAD软件界面与基本操作三、二维绘图与编辑四、尺寸标注与文字标注五、三维建模与编辑六、视图显示控制与打印输出七、图层管理与数据库管理八、CAD数据交换与二次开发九、CAD学习方法与资源推荐一、CAD基础概念与应用......
  • Linux常用命令大全超详细知识点概览
    我是小粥学姐,下面是Linux常用命令大全哦,先上目录。章节目录一、文件和目录管理命令二、文件内容查看与编辑命令三、文件搜索与查找命令四、系统管理与监控命令五、网络管理与通信命令六、用户管理与权限设置命令七、打包压缩与备份命令八、其他实用命令一、文件......
  • Nexpose 6.6.272 发布下载,新增功能概览
    Nexpose6.6.272forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releasedOct03,2024请访问原文链接:https://sysin.org/blog/nexpose-6/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序新增功能2024年10月3日......
  • 全同态加密算法概览
    我们前面有谈到《Paillier半同态加密算法》,半同态加密算法除了支持密文加法运算的Paillier算法,还有支持密文乘法计算的RSA算法,早期的PSI(隐私求交)和PIR(匿踪查询)都有使用基于RSA盲签名技术来实现。今天我们来谈谈能够有效支持任意函数密文计算的全同态加密算法(fully......
  • ​VMware NSX 4.2.0.2 发布,新增功能概览
    ​VMwareNSX4.2.0.2发布,新增功能概览VMwareNSX4.2.0.2-网络安全虚拟化平台构建具有网络连接和安全性的云智能网络,跨多种云环境支持一致的策略、运维和自动化。请访问原文链接:https://sysin.org/blog/vmware-nsx-4/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.o......
  • Nexpose 6.6.270 发布下载,新增功能概览
    Nexpose6.6.270forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releaseSep18,2024请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序新增功能2024年9月18......
  • 微服务监控实战(一):监控概览
    如果你觉得这篇文章对你有帮助,请不要吝惜你的“关注”、“点赞”、“评价”,我们可以进一步讨论实现方案和细节。你的支持永远是我前进的动力~~~灵魂拷问服务之间的依赖关系?服务的资源使用情况?每天的业务高峰期是哪个时间段?每天发生多少次异常?有多少次是在收到业务反馈之......