右值引用和移动语义
右值引用(Rvalue reference)和移动语义(Move semantics)
左值(lvalue)和右值(rvalue)
左值(也称为 locator value)
- 是一个可以被修改的存储位置,指向内存中的某个位置
- 例子:变量、数组元素、解引用指针等
判断左值的方法是:
- 能够获得这个表达式的引用
- 或者取地址
右值
C++ 11后(表达式不再简单地分为 左值、右值,看上去比较复杂)
分为2大类:
- Glvalue:泛左值
- lvalue
- xvalue(expirnig value):即将消亡的值
- Prvalue:纯右值
- xvalue
- prvalue
l-value
此外,类的数据成员也是左值
还有一个比较常见的是:返回引用的函数
prvalue(纯右值 Pure R-value)
1
右值引用 rvalue ference
普通的引用也被称作:左值引用
与左值引用类似:如果我们要获得一个右值的引用时,我们使用2个引用符号,
有了右值引用,我们就可以在函数调用时,将 左值参数 和 右值参数 分开来。
例如:我们定义了2个重载函数 func
通过重载函数,能够区分出左值引用和右值引用,接下来就可以实现 移动语义 了
上述代码有问题(在主函数中,定义了 2个 CharBuffer对象,)
拷贝构造函数如下:
这样2个对象的 m_buff 指向的是同一块内存区域,这显然不是我们想要的
而且这个代码还会导致 buf1 和 buf2 对象,在销毁过程中,调用析构函数时,对 m_buff指向的同一块内存区域释放2次,这样会导致异常
因此,我们需要定义自己的拷贝构造函数
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2024-02-26 测试用例