C++中的左值和右值
左值与右值
左值和右值有如下3个规则:
- 左值和右值都是表达式。
- 左值是对象定位器,理论上左值指示指示一个对象。
- 右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。
http://c.biancheng.net/view/281.html
左值:可以进行取地址的称为左值。
右值:不能进行取地址的称为右值。右值包括:临时对象、匿名对象、临时变量、匿名变量、字面值常量(10)
左值引用
传统的左值引用:
int a = 10;
int &b = a; // 定义一个左值引用变量
b = 20; // 通过左值引用修改引用内存的值
左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。
错误的左值引用:
int &val = 10;
10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,在这一行代码执行完毕后,就被丢弃了,可以通过下述方法(常引用)解决:
const int& val = 10;
// 等价于
const int temp = 10;
const int &val = temp;
小结:
左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被const修饰成常量引用了。
由此可知,为什么很多情况下(自定义的拷贝构造函数,运算符重载等场景下)函数的参数需要用const修饰,因为为了增强代码的健壮性。如果不用const修饰,当我们在调用函数时传入一个右值就会出问题,即普通的左值引用无法绑定到右值上,必须使用常左值引用才能绑定右值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)