C++语言学习

## 左右值引用
[参考文献1:一文读懂C++右值引用和std::move](https://zhuanlan.zhihu.com/p/335994370)

基本区分:有地址的变量是左值,没地址的字面值临时值及时右值

**左值引用**
const int& a 的使用场景  
这个被称为const左值引用,
特性:通过该引用建立的变量,无法进行修改,因此可以将该引用绑定到临时变量上。
```
void push_back(int &a);
int a = 4;
对于vec.push_back(4);  
就会出现int &a = 4;这种左值引用指向右值的问题,会编译失败
const左值引用不会修改指向值
void push_back(const int &a) 则会避免这种情况
```
**右值引用**  
右值引用专门为右值而生,可以指向右值,不能指向左值
```
int &&ref_a_right = 5; // ok

int a = 5;
int &&ref_a_left = a; // 编译不过,右值引用不可以指向左值

ref_a_right = 6; // 右值引用的用途:可以修改右值
```
使用场景:移动构造(a=b,b的复制给a后同时删除b,这就不得不使用右值引用了)

**std::move()**
该函数会将左值强制转换为右值,让右值引用可以指向左值,同时move的变量会失去原有值

```
1. 从性能上讲,左右值引用没有区别,传参使用左右值引用都可以避免拷贝。
2. 右值引用可以直接指向右值,也可以通过std::move指向左值;而左值引用只能指向左值(const左值引用也能指向右值)。
3. 作为函数形参时,右值引用更灵活。虽然const左值引用也可以做到左右值都接受,但它无法修改,有一定局限性。
```

const 在修饰返回值时可以起到保护的左右
explicit 是对于构造函数的修饰,防止隐式转换,保证vector (4), 防止 vector a = 4;
全部评论
那篇文章写的有点问题,这个理解也有问题 左值右值是一个表达式的属性,叫做值类别,不是修饰变量的。a = b 中的 b 是左值,是变量名 b 构成的标识符表达式是左值,不是变量是左值 move一个变量不会失去原有值,move只是将一个左值表达式转为亡值表达式,从而能调用移动构造/移动赋值,没有对变量做出任何修改。转换后的亡值表达式指代的那个变量会不会失去值,和move没有关系 左右值引用也和性能没有直接关系,只能说传递引用的过程不会发生拷贝,实际还是要看函数在做什么,有些情况下使用值传递也不会导致额外拷贝:https://stackoverflow.com/questions/51705967/advantages-of-pass-by-value-and-stdmove-over-pass-by-reference
1 回复 分享
发布于 2024-04-22 15:10 上海

相关推荐

02-09 16:14
武汉大学 Java
1. 问一下本科经历2. 介绍一下你第一个项目3. DDD分层架构比传统的MVC有哪些好处?4. 你设计的业务分配的算法介绍一下?5. 算法有哪些优化思路?6. 动态标签列设计怎么思考的?7. 数据量有多大?8. 数据量很大的话,数据存储怎么优化?9. 如何保证缓存和数据库之间的数据一致性?10. 相对于你这个项目用哪种方案?11. 项目中遇到的最大的困难是什么?12. 介绍一下第二个项目13. 模型分析diff的上下文怎么考虑?14. 如果diff的关联的上下文很长超过token,你会怎么办?15. 你想的这种方案,最后输入给模型的prompt是什么?16. 对于大模型的其他组件如RAG和skills有了解吗?17. 那你有想过把代码拆分成一些知识库放在rag里面吗?18. 有对比过其他模型的分析效果吗?19. golang有了解吗?20. HashMap的底层结构21. 为什么要用红黑树?22. 红黑树增删的时间复杂度?23. MySQL事务隔离级别24. MVCC实现原理25. 手撕算法:lc402 移掉k位数字 -> 没想到单调栈,暴力枚举了QAQ反问面试官之后,感觉我的缺点主要在于项目太过于玩具了,对于高并发什么的思考处于比较浅的地步,还有就是code-review对于call graph还有一些成熟的方案不怎么了解过,相当于纯demo,面过几场才知道QAQ,估计是没啥希望了,继续沉淀了噶人们
查看25道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务