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
送花
回复
分享
发布于 04-22 15:10 上海

相关推荐

4.1025min1、自我介绍2、常用的编程语言是哪个,自学的还是学校教的?3、ansible自动化配置简单讲讲(项目问题)4、lnmp配置具体出现了什么问题,怎么解决的(php的www.conf和nginx的conf里的用户和组不是一个,导致无法动态转发,通过浏览器返回渲染和nginx日志排错)5、讲讲操作系统的内存管理(我以为是讲讲linux的free命令,罗里吧嗦说了一堆,结果是让讲一些概念,页式存储和段页式存储等)6、TCP三次握手流程7、讲讲容器化技术,镜像和容器分别的概念和区别8、讲讲对k8s的了解9、讲讲你最熟悉哪一块的运维知识(nginx配置相关,面试官提问如果两个url分别访问服务器不同的静态文件该如何实现:include conf 分别写server模块,或者并入nginx主配置文件,但是好像不是这个意思,具体还需学习;nginx的黑名单和白名单如何实现,忘了。。;https和http的区别是什么样的,在nginx配置文件里怎样实现https,也忘了。。。)10、讲讲容器和虚拟机的区别、优点和缺点11、讲讲grep命令,讲讲正则(?和*代表什么),讲讲用shell写过什么样的脚本12、讲讲对zabbix监控系统的理解13、你更想学习、做哪种路线的运维14、你将来的规划是什么样的?15、了解过我们公司业务吗,玩过手游吗,讲讲对游戏业务运维的理解反问环节:1、对容器化技术和k8s的理解程度需要多深?2、有无培训机制?3、常用的linux命令需要多广多深,具体在哪些方面需要多学习一些?更新:4.16收到感谢信
点赞 评论 收藏
转发
一、项目+八股(55min)1、自我介绍2、简单介绍一下你的项目3、压测的性能瓶颈?怎么调试的?4、缓存的数据一致性问题怎么解决的?为什么选择这个方案?还可以优化吗?5、Redis为什么快?6、Redis的数据结构?7、Redis内存淘汰策略?8、什么是可重入?如何基于Redis实现一个可重入的分布式锁?9、set和set nx命令有什么区别?10、zet如何优化底层的查询的?11、设计冗余字段的背景是什么?优点是什么?缺点又是什么?12、MySQL的索引结构?13、为什么一般采用自增ID当主键?14、为什么做深度分页的时候会很慢?15、MySQL的日志文件主要有哪几种?16、事务管理通过哪些文件来管理的?17、String、StringBuilder和StringBuffer的区别?18、Synchorized和Lock的区别?19、Synchorized的锁升级过程?20、学习Java过程中,有没有什么事情是你反复练习的事情?21、介绍一件收获最大的事情?22、介绍一下项目中的多机竞争?怎么优化的?23、多机竞争的核心本质是什么?24、分表为什么要按照大小分表?有没有别的思路?分表解决的问题是冷热分离吗?25、用什么其他方案能够解决冷热数据的问题?26、怎么通过任务ID来定位到存储的表的?27、在任务生成前已经知道该任务存储到哪里了?28、你怎么知道切表了?二、算法(25min)重排链表(没做过,做了半天A了一半测试用例,面试官让说了一下思路)三、反问(5min)您觉得我本次面试有什么不足的地方?可以提供一些建议吗?(1)基础扎实,但是缺乏实践(2)实践的时候要多思考,选用哪种方案?为什么选用这种方案?有没有其他更好的方案?不要闭门造车。四、总结面试官很和蔼,遇到不会的问题也是循序渐进地引导,就是对于项目的拷打太狠了,另外算法还是刷的少了面完3分钟,北森代发短信通知过了,有佬知道美团会用这玩意吗?我一度怀疑是不是美团发的短信,如果我的外卖也能有这么高的效率就好了
点赞 评论 收藏
转发
点赞 2 评论
分享
牛客网
牛客企业服务