左值 右值 二
https://www.jianshu.com/p/94b0221f64a5
https://en.cppreference.com/w/cpp/language/value_category
https://en.cppreference.com/w/cpp/language/operator_member_access
通俗定义
-
大体还可以根据是否可以放到等号左右来区分,如果可以放到等号左边,就是左值,只能放到等号右边,就是右值
-
左值肯定在内存中有一个空间保存,右值可以理解为临时的数据,并没有专门保存
实例
一
int a = 123;
这里a是一个变量,有对应内存空间,所以a是左值,并且a可以放到等号左边,123是右值,它赋值完后就没了,并没有专有内存保存,并且不可以放到等号左边,只能在右边
二
int a = 123;
int * b = &a;
这个也是可以的,因为&符号,取地址符,是传入一个左值,返回一个纯右值。
三
int a;
123 = a;
int * b = &123;
这样都是不可以的,首先123是右值,不能放到等号左侧,它没有对应空间,无法保存a的值,同样,因为&需要传递一个左值,并且123没有空间,就没办法取地址
四
函数根据其返回值不同会有不同的意义,返回为左值引用的函数可以做左值,返回为非引用的只能做右值
int test1()
{
return 123;
}
int b;
int& test2()
{
b = 123;
return b;
}
test1() = 123;
是错误的,因为是test1返回的是右值,不能赋值
test2() = 123;
是对的,因为返回的是b,是左值
五
左值可以转换为右值
int a = 123;
int b = 123;
int c = a + b;
这里a + b
变成了右值
六
可以将一个右值常量绑定到一个左值const引用
const int & a = 123;
123的生命周期延长至与a相同
同理,如下调用是合法的
int test(const int & a)
{
return 0;
}
int main()
{
test(123);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏