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收到感谢信
点赞 评论 收藏
转发
点赞 2 评论
分享
牛客网
牛客企业服务